Skip to main content

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 部分