以太坊有哪三种树?深入解析状态树、交易树与收据树

博主:neragonerago 2026-10-01 21:48:36 3

以太坊(Ethereum)作为全球第二大区块链平台,其底层数据结构设计精妙而高效,在以太坊的世界里,“树”(Trie/Merkle Tree)是存储和验证数据的核心结构,很多初学者常问:以太坊到底有哪三种树?它们各自的作用是什么?本文将为你详细解析以太坊的三种树:状态树(State Trie)、交易树(Transaction Trie)和收据树(Receipt Trie)。

先了解基础:什么是 Merkle Patricia Tree?

在讲三种树之前,需要先了解以太坊使用的底层数据结构——MPT(Merkle Patricia Tree,默克尔帕特里夏树)。

MPT 结合了三种数据结构的优点:

  • 默克尔树(Merkle Tree):提供数据完整性验证,根哈希可证明数据未被篡改;
  • 帕特里夏树(Patricia Tree):一种压缩前缀树,节省存储空间,查找效率高;
  • 字典树(Trie):支持高效的键值对(Key-Value)存储。

以太坊的三种树都是基于 MPT 构建的,但它们的用途和存储内容各不相同。

第一种:状态树(State Trie)

是什么?

状态树是三种树中最重要、最庞大的一棵树,它存储着以太坊全网所有账户的状态信息,任何人查询某个账户的余额、 nonce 值,都要通过状态树。

存储了什么?

状态树以 keccak256(地址) 作为键(Key),以账户信息作为值(Value),账户信息包括:

  • Nonce:该账户发出过的交易数量(普通账户)或合约创建的合约数量(合约账户);
  • Balance:账户余额(以 Wei 为单位);
  • StorageRoot:合约账户的存储树的根哈希(普通账户此字段为空);
  • CodeHash:合约代码的哈希(普通账户此字段为空字符串的哈希)。

特点

  1. 全局唯一:整个以太坊网络在某一时刻只维护一棵全局状态树;
  2. 持续更新:每笔交易执行后,相关账户的状态都会更新,状态树的根哈希也会随之改变;
  3. 状态树根哈希存储在区块头中,即 stateRoot 字段,用于验证全网状态的一致性。

第二种:交易树(Transaction Trie)

是什么?

交易树存储的是某个区块内所有交易(Transactions)的记录,每生成一个新区块,就会为该区块内的交易单独构建一棵交易树。

存储了什么?

  • 键(Key):交易在区块中的索引(序号),如 0、1、2……经过 RLP 编码;
  • 值(Value):交易的具体内容,包括发送者、接收者、金额、Gas 限制、签名数据等。

特点

  1. 每个区块一棵:与状态树不同,交易树是按区块独立构建的;
  2. 不可修改:一旦区块上链,交易树的内容就永久固定;
  3. 根哈希存储在区块头中,即 transactionsRoot 字段;
  4. 支持轻节点验证:轻节点(Light Client)无需下载完整区块,只需通过 Merkle 证明(SPV 证明)即可验证某笔交易是否存在于某个区块中。

第三种:收据树(Receipt Trie)

是什么?

收据树存储的是每笔交易执行后的结果回执(Transaction Receipt),交易树记录“发了什么交易”,收据树则记录“交易执行得怎么样”。

存储了什么?

  • 键(Key):同样是对应交易的索引序号;
  • 值(Value):交易回执,主要包括:
    • 交易执行状态:成功或失败;
    • Gas 消耗量:该交易实际消耗的 Gas;
    • 日志(Logs):合约执行过程中产生的事件日志,这是 DApp 前端和区块链浏览器监听事件的基础;
    • Bloom 过滤器:用于快速判断某交易是否产生了特定日志。

特点

  1. 与交易树一一对应:每笔交易都有对应的回执;
  2. 根哈希存储在区块头中,即 receiptsRoot 字段;
  3. 日志是事件查询的核心:钱包、DApp、区块链浏览器展示的转账结果、合约事件,都来自收据树的日志数据。

三种树的对比总结

| 对比项 | 状态树 | 交易树 | 收据树 | |--------|--------|--------|--------|| 全网所有账户状态 | 区块内所有交易 | 交易执行结果回执 | | 键(Key) | keccak256(账户地址) | 交易索引 | 交易索引 | | 树的数量 | 全网一棵(持续更新) | 每个区块一棵 | 每个区块一棵 | | 区块头字段 | stateRoot | transactionsRoot | receiptsRoot | | 是否可变 | 随交易不断更新 | 生成后不可变 | 生成后不可变 |

为什么这样设计?

以太坊采用三树结构,主要出于以下考虑:

  1. 数据可验证性:三个树根都记录在区块头中,矿工挖矿时对区块头哈希,任何数据的篡改都会导致根哈希不匹配,从而被网络拒绝;
  2. 支持轻节点:轻节点只需下载区块头(80 字节左右),就能通过 Merkle 证明验证余额、交易和执行结果,大幅降低运行门槛;
  3. 职责分离:状态、交易、回执分开存储,各司其职,既清晰高效,又便于快速检索。

以太坊的三种树,状态树、交易树、收据树,共同构成了区块链数据存储与验证的基石,状态树记录“世界当前的样子”,交易树记录“发生了什么”,收据树记录“结果如何”,理解这三种树,不仅是理解以太坊底层原理的关键一步,也是深入学习区块链开发的必经之路,希望本文能帮助你建立起清晰的认知框架,在探索以太坊的道路上走得更远。

The End

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