ETH网络中的账户
Externally owned accounts (EOA) - 外部账户
由用户控制,我们导入助记词创建的账户就属于此类账户。
Contract accounts (smart contracts) - 合约账户
合约账户由以太坊虚拟机执行的代码控制。它也被称为智能合约。合约帐户有相关的代码和数据存储,但没有私钥。这些账户的控制方式由他们的智能合约代码决定。
合约账户一般是由外部账户创建的,账户地址产生自创建人的地址和从创建人地址发送的交易数量(“nonce”)。
两种账户类型对比
外部账户 | 合约账户 | ||
---|---|---|---|
🏔️ | balance | 有 | 有 |
⛰️ | nonce | 有 | 有 |
🏕️ | codeHash | 无 | 有 |
🏖️ | storageRoot | 无 | 有 |
🏜️ | 控制权 | 用户 | 合约代码 |
🏝️ | 创建是否需要费用 | 不需要 | 需要 |
🏞️ | 是否可以主动发起交易 | 可以 | 不可以,只有合约代码被调用才会触发交易 |
🏟️ | 是否有私钥 | 有 | 没有 |
codeHash
: 该哈希表示以太坊虚拟机 (EVM) 上的代码。 合约帐户具有编程的代码片段,可以执行不同的操作。 如果帐户收到消息调用,则执行此 EVM 代码。 与其他帐户字段不同,不能更改。 所有代码片段都被保存在状态数据库的相应哈希下,供后续检索。 此哈希值称为 codeHash。 对于外部所有的帐户,codeHash 字段是空字符串的哈希。storageRoot
: 有时被称为 storageHash(存储哈希)。它是存储在以太坊区块头中的一个字段。具体而言,以太坊使用默克尔树(Merkle Trie)来组织和表示账户状态。