以太坊的三种树,状态树、交易树与收据树详解
以太坊作为全球最大的智能合约平台,其底层数据结构设计极为精妙,为了高效地存储和验证海量数据,以太坊采用了默克尔帕特里夏树作为核心数据结构,在整个以太坊系统中,存在着三种不同功能的树:状态树、交易树和收据树,这三种树相互配合,共同支撑起了以太坊区块链的运行,本文将深入解析这三种树的结构、功能与作用。
为什么以太坊需要树结构?
在了解三种树之前,我们先要理解以太坊为什么选择默克尔树结构:
- 数据完整性验证:树根哈希可以验证整棵树中所有数据的完整性,任何数据被篡改都会导致根哈希改变。
- 轻节点支持:SPV(简单支付验证)节点只需下载区块头,就能通过默克尔证明验证某笔交易或某个账户状态。
- 高效存储与查找:帕特里夏树的特性使得数据的插入、删除和查找效率极高。
第一种:状态树
定义
状态树是记录以太坊全世界所有账户状态的树结构,它是三种树中唯一一个全局唯一的树,随时间不断更新。
状态树中,每个键值对代表一个账户:
- 键:账户地址的 keccak256 哈希值
- 值:经过 RLP 编码的账户数据,包含四个字段:
nonce:该账户发出的交易数量(普通账户)或合约创建的序号balance:账户的以太币余额storageRoot:存储树的根哈希(合约账户存储数据的地方)codeHash:合约代码的哈希
关键特性
- 状态树的根哈希存储在区块头的
stateRoot字段中 - 每挖出一个新区块,状态树都会发生变化
- 几乎所有节点共享同一份状态数据,以路径压缩和节点共享的方式节省存储空间
第二种:交易树
定义
交易树记录了某个区块内所有交易的信息,每个区块都有自己独立的交易树。
- 键:交易在区块中的索引号(RLP 编码,如 0x00、0x01...)
- 值:交易的具体数据,包括发送者、接收者、金额、Gas 限制、签名等
关键特性
- 交易树的根哈希存储在区块头的
transactionsRoot字段中 - 一旦区块被确认,交易树的内容就不可篡改
- 主要用于验证某笔交易确实存在于某个区块中
- 支持默克尔证明:轻节点无需下载完整区块,即可证明某笔交易的存在
第三种:收据树
定义
收据树记录了每笔交易执行后的结果信息,它与交易树一一对应,同样每个区块独立拥有。
- 键:交易在区块中的索引号(与交易树的键一致)
- 值:交易收据数据,包含:
- 交易执行后的状态
- 使用的 Gas 数量
- 交易产生的日志
- 布隆过滤器
关键特性
- 收据树的根哈希存储在区块头的
receiptsRoot字段中 - 布隆过滤器是其一大亮点:节点可以通过布隆过滤器快速判断某区块中是否包含感兴趣的日志,而无需遍历所有收据
- 广泛应用于事件监听,例如钱包通知、DApp 的事件触发等场景
三种树的对比总结
| 对比项 | 状态树 | 交易树 | 收据树 |
|---|---|---|---|
| 全部账户状态 | 区块内所有交易 | 交易执行结果 | |
| 树的数量 | 全局唯一 | 每区块一棵 | 每区块一棵 |
| 是否可变 | 随区块更新 | 一旦确认不可变 | 一旦确认不可变 |
| 根哈希位置 | stateRoot | transactionsRoot | receiptsRoot |
| 键 | 账户地址哈希 | 交易索引 | 交易索引 |
三种树如何协同工作?
以太坊每产生一个新区块,三种树的协作过程如下:
- 矿工打包交易,构建交易树,计算 transactionsRoot
- 逐笔执行交易,生成执行结果,构建收据树,计算 receiptsRoot
- 所有交易执行完毕后,更新受影响的账户状态,得到新的状态树,计算 stateRoot
- 三个根哈希被写入区块头,随区块一起保存
正是通过这三个根哈希,任何人都无需存储完整数据,就能验证链上任意账户状态、任意交易及其执行结果的真实性。
状态树、交易树和收据树构成了以太坊数据层的“三驾马车”:状态树维护着世界状态的现在,交易树记录着状态变更的原因,收据树则证明了变更的结果,理解这三种树的结构与关系,是深入学习以太坊原理、开发 DApp 以及研究区块链底层技术的必修课,随着以太坊不断升级,这些数据结构也在持续优化,但其核心思想,用默克尔树实现可验证的高效数据存储,将始终是以太坊架构的基石。
The End
发布于:2026-09-19,除非注明,否则均为原创文章,转载请注明出处。
