区块链应用开发指南:业务场景剖析与实战
上QQ阅读APP看书,第一时间看更新

4.3 账户

智能合约在以太坊网络中表现为一种特殊账户:合约账户

账户在以太坊中是非常重要的概念,开发过程中离不开它,以太坊中有两类账户:

(1)外部用户账户(EOAs)——该类账户被公钥——私钥对控制(由人控制)。

(2)合约账户——该类账户被存储在账户中的代码控制。

外部用户账户和合约账户,都用同样的地址形式表示,地址形式为:0xea674fdde714fd979de3edf0f56aa9716b898ec8,是一个20字节的16进制数。

本书中,账户(或账号)和地址两个概念没有区别,有时地址也会指代账户。

外部用户账户的地址是由私钥推导出来的(在本书第10章会作进一步介绍),合约账户的地址则由创建者的地址和nonce计算得到,这里就不深入介绍,有兴趣的读者可以延伸阅读《以太坊合约地址是怎么计算出来的?》 文章地址:https://learnblockchain.cn/2019/06/10/address-compute/。 这篇文章。

外部用户账户和合约账户都可以有余额;合约账户使用代码管理所拥有的资金,外部用户账户则是用私钥签名来花费资金;合约账户存储了代码,外部用户账户则没有。它们还有一个不能忽视的区别:只有外部用户账户可以发起交易(主动行为),合约账户只能被动地响应动作。

账户状态

账户状态有4个基本组成部分,不论账户类型是什么,都存在这4个组成部分。

  • nonce:如果账户是外部用户账户,nonce代表从此账户地址发送的交易序号。如果账户是合约账户,nonce代表此账户创建的合约序号

提示:以太坊中有两种nonce,一种是账号nonce——表示一个账号的交易数量;一种是工作量证明nonce——一个用于计算满足工作量证明的随机数。

  • balance:此地址拥有以太币余额数量。单位是Wei,1 ether=1018 wei,当向地址发送带有以太币的交易时,balance会随之改变。

ether和wei是以太坊中以太币的两种面额单位,就像人民币的元和分,除此之外,还有一个常用的面额单位Gwei,用来给gas定价,1 Gwei = 109 wei。

  • storageRoot:Merkle Patricia树的根节点哈希值。Merkle树会将此账户存储内容的哈希值进行编码,默认是空值。
  • codeHash:此账户代码的哈希值。对于合约账户,就是合约代码被哈希计算后的哈希值作为codeHash保存。对于外部用户账户,codeHash是一个空字符串的哈希值。

以太坊的全局共享状态是由所有账户状态组成,它由账户地址和账户状态组成的映射存储在区块的状态树中,如图4-3所示。

图4-3 以太坊全局状态