一文读懂以太坊的三种树,状态树、交易树与收据树
在以太坊的世界里,除了区块和交易这些耳熟能详的概念外,还隐藏着三棵至关重要的“树”,它们是以太坊数据结构的基石,支撑着整个区块链的存储、验证与查询机制,这三种树分别是:状态树(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前端监听合约事件、区块链浏览器展示交易成败状态、钱包显示手续费消耗,背后都依赖收据树中的数据。
三种树的核心对比
| 维度 | 状态树 | 交易树 | 收据树 |
|---|---|---|---|
| 数量 | 全网唯一 | 每区块一棵 | 每区块一棵 |
| 是否可变 | 随交易动态更新 | 生成后不可变 | 生成后不可变 |
| 所有账户状态 | 区块内全部交易 | 交易执行结果 | |
| 账户地址哈希 | 交易 |
发布于:2026-10-05,除非注明,否则均为原创文章,转载请注明出处。
