Accounts
账户
在 Conflux 区块链网络中是一个非常重要的实体对象,可用来存放 CFX (账户有 CFX 余额),以及发送 Conflux 交易。账户以及账户余额被存储在 Conflux VM 的一个大数据表中,它们是 Conflux 账本全状态的一部分。
账户的类型
Conflux 有两种类型账户:
- 外部账户(私钥账户)- 被私钥的持有者控制
- 智能合约 - 是一个部署在网络中的智能合约,被合约代码所控制
备注:Conflux 网络中有一种特殊的智能合约账户 -- 内置合约, 他们是网络启动或升级时自动创建,而非通过合约代码部署创建,目前 Conflux 网络有 6 个内置合约。
相同点
- 都可以接受,持有,发送 CFX 和 tokens
- 都能与网络中的智能合约交互
异同点
外部账户
- 账户创建不需要消耗 CFX 或其他资源
- 可以主动发送交易
- 外部账户间的交易只能是 CFX 或 tokens 转账
智能合约
- 合约账户的创建有成本,因为使用了网络的存储和计算资源
- 只有在接收到交易进行响应时,可对其他合约发出交易
- 外部账户发送给合约账户的交易,可触发智能合约的代码,完成许多不同的操作,例如 tokens 转账,创建新合约等等。
外部账户与公私钥对
一个外部账户是由一对加密公私钥产生的,它们可以用来证明一个交易真的是由某个账户签署的,防止交易伪造。私钥是用户用来签署交易的,它可以给你操作私钥对应账户上资金的权利。 本质上用户并不持有 CFX 或 token,而是持有私钥,CFX 永远存在于 Conflux 的账本中。
这种机制可以避免恶意的人员,广播假交易,因为我们随时可以验证交易的发送地址。
举个例子。Alice 想从自己拥有的账户发送 CFX 给 Bob 的账户,Alice 需要创建一个交易,并发送到网络中进行验证。Conflux 使用公开秘钥加密机制来确保 Alice 可以证明这笔交易就是由 Alice 本人发出的。没有这个机制一个恶意的第三用户 Eve 可以直接广播一笔交易 ”从 Alice 的账户发送 5 CFX 到 Eve 账户“ 并且也没有人能够验证交易是由 Alice 发出来的。
外部账户创建
当你想创建一个外部账户,你可以使用钱包比如 FluentWallet,也可以使用开发语言的库,本质上他们是随机生成了一个私钥。
一个私钥包含 64 个 hex 字符,可以使用密码进行加密。
fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f
公钥则是通过椭圆曲线加密算法从私钥计算出来的,然后对公钥进行 Keccak-256 哈希计算,取最后 20 字节,然后进行base32 编码即是 Conflux 地址。
// 主网地址
cfx:aatktb2te25ub7dmyag3p8bbdgr31vrbeackztm2rj
// 测试网地址
cfxtest:aatktb2te25ub7dmyag3p8bbdgr31vrbeajcg9pwkc
通过私钥可以推算出公钥,但反之则不行,私钥需要用户自己妥善保管
智能合约账户
合约账户同样有一个 base32 编码的地址
cfx:acf2rcsh8payyxpg6xj7b0ztswwh81ute60tsw35j7
该地址是在合约被部署时确定的,是通过部署交易发送账户地址
,及其 nonce
以及合约的代码
计算出来的。
注:内置合约账户地址是由网络自行分配的,比较特殊
账户详解
Conflux 的全局状态是由一个个账户状态组成,每个账户是一个 账户地址-账户状态对(key pair)
一个 Conflux 账户状态包含五部分:
-
基本状态
账户的基本状态 -
存储状态
是一个 key/value 的数据库或存储空间,可用于存储一些智能合约自定义的数据或状态 -
代码信息
智能合约账户的代码信息,包含合约代码
以及为代码所占用存储空间支付抵押费用的账户地址
-
Staking deposit 列表
账户参与 Staking 的质押操作列表 (该列表将在下个 Hardfork 移除) -
Staking vote lock 列表
账户为参与 DAO 投票,而进行的锁定操作列表
其中账户的基本状态又由如下八个字段组成:
-
nonce
一个计数器用来记录某账户发送交易的数量,该计数器同时用来确保交易只会被执行一次。对于合约账户,此数值则表示被该合约创建的合约
的数量。 -
balance
该账户地址所用户的 Drip 数量,Drip 是 CFX 的最小单位,1CFX=1e+18 Drip -
codeHash
合约账户代码的 hash,用户快速引用合约代码,合约创建后代码不可修改,在合约接收到 message call 的时候,其代码将会被执行;对于普通账户 codeHash 是一个空字符串 hash -
stakingBalance
账户参与 Staking 的余额,单位同样是 Drip -
admin
AdminControl 内置合约所记录的合约账户
的管理员地址,合约账户管理员在创建时被默认设置为部署账户地址,管理员可通过 AdminControl 内置合约销毁掉其所管理的合约,也可将管理员身份移交给其他账户;外部账户的管理员地址为其本身 -
sponsorInfo
合约账户的赞助者信息:包含sponsor for gas
,sponsor for collateral
,sponsor gas limit
,sponsor balance for gas
以及sponsor balance for collateral
-
storageCollateral
账户为占用存储所抵押的 Drip 数量 -
accumulatedInterestReturn
账户参与 Staking 所获得的累计收益数量,单位为 Drip,从 Conflux 2.0 开始,用户需同时参与 PoS 才能获得奖励。
关于账户的更详细介绍可参看 Conflux 黄皮书的 Accounts 部分
No Comments