📘账户模型与状态存储

  • Henry Wei
  • 发布于 2025-05-29 12:03
  • 阅读 137

以太坊采用状态账户模型(State-based Account Model),而非比特币的 UTXO 模型。本文将深入剖析账户的分类、数据结构、状态存储方式,以及底层 Merkle Patricia Trie 的工作原理,为理解智能合约的执行逻辑打下基础。

📚 作者:Henry 🧱 系列:《以太坊工作原理全解析》 · 第 3 篇 👨‍💻 受众:Web3 开发者 / 区块链学习者 👉 系列持续更新中,建议收藏专栏或关注作者。

✦ 1. 为什么以太坊不用 UTXO?

比特币使用的是 UTXO(Unspent Transaction Output)模型

  • 每一笔交易消耗一组输入,生成一组输出
  • 状态不可变、追溯性强、适合转账
  • 不支持全局变量与复杂状态逻辑

但以太坊的目标是成为通用计算平台,需要能够:

  • 追踪变量的历史状态
  • 支持链上存储的读写变更
  • 维护全球共享状态

因此,以太坊选择了更像“账户账本”的状态账户模型(每个账户有状态,状态可变)。


✦ 2. 以太坊账户分类:EOA vs 合约账户

类型 名称 控制方式 是否含代码 是否可主动发交易
EOA 外部账户(Externally Owned Account) 私钥签名控制 ✅ 可以发起交易
CA 合约账户(Contract Account) 被合约逻辑调用 ❌ 只能被动响应调用

每个账户都由一个 20 字节的地址标识,其生成方式如下

  • EOA:由公钥哈希生成(address = last20bytes(keccak256(pubkey))
  • CA:由创建者地址和 nonce 哈希生成(address = keccak256(rlp(sender, nonce))

📌 合约账户无法主动发交易,但可以在被调用时再发起内部调用。


✦ 3. 账户结构:以太坊状态的核心单元

每个账户在状态树中以键值对形式存储,包含以下核心字段:

{
  "nonce": uint,       // 发起交易的计数器(防重放)
  "balance": uint,     // 当前余额(单位:wei)
  "storageRoot": hash, // 合约状态变量存储的根哈希
  "codeHash": hash     // 合约代码哈希(或空)
}
  • 对于 EOA,storageRootcodeHash 为空
  • 对于CA,storageRoot 指向其持久化变量存储, codeHash 存储 runtime bytecode 的哈希

✦ 4. 存储结构类型:Merkle Patricia Trie(MPT)

以太坊采用Merkle Patricia Trie,一种混合结构,用于确保状态可验证、压缩、高效查找

  • Merkle Tree:通过哈希保证数据不可篡改
  • Patricia Trie:前缀压缩,提高键值检索效率
  • RLP 编码:节点序列化,节省存储空间

![03_mpt.png](https://img.learnblockchain.cn/attachments/2025/...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Henry Wei
Henry Wei
Web3 探索者