上QQ阅读APP看书,第一时间看更新
4.3 账户
智能合约在以太坊网络中表现为一种特殊账户:合约账户。
账户在以太坊中是非常重要的概念,开发过程中离不开它,以太坊中有两类账户:
(1)外部用户账户(EOAs)——该类账户被公钥——私钥对控制(由人控制)。
(2)合约账户——该类账户被存储在账户中的代码控制。
外部用户账户和合约账户,都用同样的地址形式表示,地址形式为:0xea674fdde714fd979de3edf0f56aa9716b898ec8,是一个20字节的16进制数。
本书中,账户(或账号)和地址两个概念没有区别,有时地址也会指代账户。
外部用户账户的地址是由私钥推导出来的(在本书第10章会作进一步介绍),合约账户的地址则由创建者的地址和nonce计算得到,这里就不深入介绍,有兴趣的读者可以延伸阅读《以太坊合约地址是怎么计算出来的?》 这篇文章。
外部用户账户和合约账户都可以有余额;合约账户使用代码管理所拥有的资金,外部用户账户则是用私钥签名来花费资金;合约账户存储了代码,外部用户账户则没有。它们还有一个不能忽视的区别:只有外部用户账户可以发起交易(主动行为),合约账户只能被动地响应动作。
账户状态
账户状态有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 以太坊全局状态