以太坊的三种树,状态树、交易树与收据树详解

博主:neragonerago 2026-09-19 01:13:42 3

以太坊作为全球最大的智能合约平台,其底层数据结构设计极为精妙,为了高效地存储和验证海量数据,以太坊采用了默克尔帕特里夏树作为核心数据结构,在整个以太坊系统中,存在着三种不同功能的树:状态树、交易树和收据树,这三种树相互配合,共同支撑起了以太坊区块链的运行,本文将深入解析这三种树的结构、功能与作用。

为什么以太坊需要树结构?

在了解三种树之前,我们先要理解以太坊为什么选择默克尔树结构:

  1. 数据完整性验证:树根哈希可以验证整棵树中所有数据的完整性,任何数据被篡改都会导致根哈希改变。
  2. 轻节点支持:SPV(简单支付验证)节点只需下载区块头,就能通过默克尔证明验证某笔交易或某个账户状态。
  3. 高效存储与查找:帕特里夏树的特性使得数据的插入、删除和查找效率极高。

第一种:状态树

定义

状态树是记录以太坊全世界所有账户状态的树结构,它是三种树中唯一一个全局唯一的树,随时间不断更新。

状态树中,每个键值对代表一个账户:

  • :账户地址的 keccak256 哈希值
  • :经过 RLP 编码的账户数据,包含四个字段:
    • nonce:该账户发出的交易数量(普通账户)或合约创建的序号
    • balance:账户的以太币余额
    • storageRoot:存储树的根哈希(合约账户存储数据的地方)
    • codeHash:合约代码的哈希

关键特性

  • 状态树的根哈希存储在区块头的 stateRoot 字段中
  • 每挖出一个新区块,状态树都会发生变化
  • 几乎所有节点共享同一份状态数据,以路径压缩和节点共享的方式节省存储空间

第二种:交易树

定义

交易树记录了某个区块内所有交易的信息,每个区块都有自己独立的交易树。

  • :交易在区块中的索引号(RLP 编码,如 0x00、0x01...)
  • :交易的具体数据,包括发送者、接收者、金额、Gas 限制、签名等

关键特性

  • 交易树的根哈希存储在区块头的 transactionsRoot 字段中
  • 一旦区块被确认,交易树的内容就不可篡改
  • 主要用于验证某笔交易确实存在于某个区块中
  • 支持默克尔证明:轻节点无需下载完整区块,即可证明某笔交易的存在

第三种:收据树

定义

收据树记录了每笔交易执行后的结果信息,它与交易树一一对应,同样每个区块独立拥有。

  • :交易在区块中的索引号(与交易树的键一致)
  • :交易收据数据,包含:
    • 交易执行后的状态
    • 使用的 Gas 数量
    • 交易产生的日志
    • 布隆过滤器

关键特性

  • 收据树的根哈希存储在区块头的 receiptsRoot 字段中
  • 布隆过滤器是其一大亮点:节点可以通过布隆过滤器快速判断某区块中是否包含感兴趣的日志,而无需遍历所有收据
  • 广泛应用于事件监听,例如钱包通知、DApp 的事件触发等场景

三种树的对比总结

对比项 状态树 交易树 收据树
全部账户状态 区块内所有交易 交易执行结果
树的数量 全局唯一 每区块一棵 每区块一棵
是否可变 随区块更新 一旦确认不可变 一旦确认不可变
根哈希位置 stateRoot transactionsRoot receiptsRoot
账户地址哈希 交易索引 交易索引

三种树如何协同工作?

以太坊每产生一个新区块,三种树的协作过程如下:

  1. 矿工打包交易,构建交易树,计算 transactionsRoot
  2. 逐笔执行交易,生成执行结果,构建收据树,计算 receiptsRoot
  3. 所有交易执行完毕后,更新受影响的账户状态,得到新的状态树,计算 stateRoot
  4. 三个根哈希被写入区块头,随区块一起保存

正是通过这三个根哈希,任何人都无需存储完整数据,就能验证链上任意账户状态、任意交易及其执行结果的真实性。

状态树、交易树和收据树构成了以太坊数据层的“三驾马车”:状态树维护着世界状态的现在,交易树记录着状态变更的原因,收据树则证明了变更的结果,理解这三种树的结构与关系,是深入学习以太坊原理、开发 DApp 以及研究区块链底层技术的必修课,随着以太坊不断升级,这些数据结构也在持续优化,但其核心思想,用默克尔树实现可验证的高效数据存储,将始终是以太坊架构的基石。

The End

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