一文读懂以太坊的三种树,状态树、交易树与收据树

博主:neragonerago 2026-10-05 23:18:35 1

在以太坊的世界里,除了区块和交易这些耳熟能详的概念外,还隐藏着三棵至关重要的“树”,它们是以太坊数据结构的基石,支撑着整个区块链的存储、验证与查询机制,这三种树分别是:状态树(State Trie)、交易树(Transaction Trie)和收据树(Receipt Trie),理解了它们,你就理解了以太坊数据组织的核心逻辑。

为什么以太坊需要“树”?

以太坊采用的数据结构叫做 Merkle Patricia Trie(MPT,默克尔帕特里夏树),它融合了两种经典结构的优点:

  • Merkle树:将数据逐层哈希,最终生成一个根哈希(Root),只要任何一份数据被篡改,根哈希就会改变,从而可以快速验证数据的完整性。
  • Patricia Trie(压缩前缀树):通过共享公共前缀来压缩存储空间,让海量键值对的查找效率极高。

以太坊将二者结合,既保证了数据可验证性,又实现了高效的存储与查询,而MPT在以太坊中恰恰被应用在三个地方,也就是我们要讲的三种树。

状态树(State Trie)——以太坊的“世界账本”

状态树是全局唯一的,记录着以太坊网络中所有账户的当前状态。

  • 键(Key):账户地址的哈希,即 keccak256(rlp(address))
  • 值(Value):账户的具体内容,包括:
    • nonce:账户已发送的交易数(或合约已创建的合约数)
    • balance:账户余额
    • storageRoot:合约存储树的根(外部账户此字段为空)
    • codeHash:合约代码的哈希(外部账户此字段为空)

状态树的最大特点是动态变化:每执行一笔转账或合约调用,相关账户的状态就会更新,状态树的根哈希(stateRoot)也随之改变,并记录在区块头中。

正是通过stateRoot,任何人都能验证“在某个区块高度时,某个账户的余额是多少”,而无需信任任何第三方。

交易树(Transaction Trie)——区块的交易记录

每个区块都对应一棵独立的交易树,记录该区块内打包的所有交易。

  • 键(Key):交易在区块中的序号,即 rlp(index),如第0笔交易、第1笔交易……
  • 值(Value):交易的具体内容(发送者、接收者、金额、gas限制、签名等)

交易树的特点是一经生成、永不修改(除非发生区块重组),区块头中的 transactionsRoot 就是这棵树的根哈希。

它的价值在于提供交易包含性证明:轻节点无需下载完整区块链,只需凭借Merkle证明,就能验证某笔交易确实被打包进了某个区块。

收据树(Receipt Trie)——交易的“执行回执”

交易执行后会产生什么结果?这就需要收据树来回答,每个区块同样对应一棵独立的收据树。

  • 键(Key):与交易树一致,使用 rlp(index),保证交易与回执一一对应
  • 值(Value):交易回执(Receipt),包含:
    • status:交易执行状态(成功或失败,EIP-65之后用1和0表示)
    • cumulativeGasUsed:区块内到此交易为止的累计gas消耗
    • logs:交易执行过程中产生的事件日志
    • bloomFilter:布隆过滤器,用于快速检索日志

区块头中的 receiptsRoot 就是收据树的根哈希。

收据树的应用非常广泛:DApp前端监听合约事件、区块链浏览器展示交易成败状态、钱包显示手续费消耗,背后都依赖收据树中的数据。

三种树的核心对比

维度 状态树 交易树 收据树
数量 全网唯一 每区块一棵 每区块一棵
是否可变 随交易动态更新 生成后不可变 生成后不可变
所有账户状态 区块内全部交易 交易执行结果
账户地址哈希 交易
The End

发布于:2026-10-05,除非注明,否则均为区块链社区- 欧亿APP下载原创文章,转载请注明出处。