1、账户的分类
当我们将智能合约部署到链上之后,它会用一个地址来表示(称为合约地址),这是一个以太坊网络中的一种帐户:合约账户
账户在以太坊中是非常重要的概念,任何事情都离不开它。以太坊中有两类账户:
(1)外部用户账户(EOAs)——该类账户由公钥-私钥对控制(由人控制)。
(2)合约账户(CA:Contract Account)——该类账户由存储在账户中的代码控制。
外部用户账户和合约账户,它们都使用相同的地址格式来表示,在EVM层面是一样的,地址格式为:0xea674fdde714fd979de3edf0f56aa9716b898ec8,是一个20字节的16进制数。
它们之间还有一个不可忽视的区别:只有外部用户账户可以发起交易(主动行为),而合约账户只能被动地响应操作,并且所有的手续费(Gas)必须由外部账户支付。
2、账户的各种状态
无论账户类型如何,账户状态都由4个基本组成部分组成:
-
nonce :如果账户是一个外部用户账户,nonce代表从此账户地址发送的交易序号。如果账户是一个合约账户,nonce代表此账户创建的合约序号。以太坊中有两种nonce , 一种是账号nonce——表示一个账号的交易数量;一种是工作量证明nonce——一个用于计算满足工作量证明的随机数。
-
balance:此地址拥有的以太币余额数量。单位是
Wei
,1 ether
=10^18 wei
。当向地址发送带有以太币的交易时,balance会随之改变。外部用户账户和合约账户都可以有余额;合约账户使用代码管理所拥有的资金,外部用户账户则是使用私钥签名来花费资金;合约账户存储了代码,外部用户账户则没有。 -
storageRoot:Merkle Patricia树的根节点哈希值。Merkle树会将此账户存储内容的哈希值进行编码,默认是空值。
-
codeHash:此账户代码的哈希值。对于合约账户,它是合约代码被哈希计算之后的结果作为codeHash保存。对于外部用户账户,codeHash 是一个空字符串的哈希值。