以太坊的三种树是什么?深入解析状态树、交易树与收据树
在区块链的世界里,如何在去中心化的环境中高效、安全地存储和验证数据,是一个核心问题,比特币引入了默克尔树(Merkle Tree)来解决交易数据的验证问题,而以太坊作为功能更加强大的智能合约平台,其数据结构也更加复杂,以太坊在默克尔树的基础上,结合帕特里夏树(Patricia Trie),设计了默克尔帕特里夏树(Merkle Patricia Tree,简称 MPT),并在区块中维护了三种关键的树结构:状态树、交易树和收据树,本文将详细解析这三种树的作用、结构与区别。
前置知识:什么是默克尔帕特里夏树(MPT)?
在了解三种树之前,先简单认识一下 MPT 这个基础数据结构。
- 默克尔树的特性:所有数据通过哈希逐级向上汇聚,最终形成一个根哈希(Root Hash),任何底层数据的细微改动,都会导致根哈希的巨大变化,因此可以快速验证数据是否被篡改。
- 帕特里夏树的特性:一种压缩前缀树,能够高效地进行键值对(Key-Value)的插入、删除和查询,避免存储空间的浪费。
MPT 将两者结合,既支持快速的数据检索与更新,又能提供密码学层面的数据完整性证明,以太坊的三种树,本质上都是 MPT 的具体应用。
状态树(State Trie)
作用
状态树是整个以太坊系统中唯一且全局的树,记录了以太坊网络中所有账户的当前状态,无论你是在钱包里查看 ETH 余额,还是调用智能合约读取变量,背后查询的都是状态树中的数据。
状态树的键(Key)是账户地址的哈希(keccak256(地址)),值(Value)是经过 RLP 编码的账户信息,包含两个主要部分:
普通账户(外部账户)包含:
- Nonce:该账户发出过的交易数量
- Balance:账户的 ETH 余额
合约账户包含:
- Nonce:合约创建的合约数量
- Balance:合约持有的 ETH 余额
- StorageRoot:合约存储树的根哈希(合约的所有状态变量都存储在这棵子树中)
- CodeHash:合约代码的哈希
关键特点
- 状态树的根哈希(stateRoot)存储在每个区块头中
- 每当有交易执行、账户余额变化时,状态树都会更新
- 所有全节点维护同一份状态树,通过 stateRoot 保证全球状态的一致性
交易树(Transaction Trie)
作用
交易树记录了单个区块内所有交易,是区块数据的组织形式。
- 键:交易在区块中的序号(RLP 编码后的索引,如 0, 1, 2...)
- 值:交易的完整内容,包括发送者、接收者、金额、Gas 上限、签名数据等
关键特点
- 交易树的根哈希(transactionsRoot)存储在区块头中
- 一旦区块被打包确认,交易树就不可修改——这与状态树“不断更新”的特性形成鲜明对比
- 每个区块都有一棵独立的交易树
- 支持默克尔证明:轻节点无需下载完整区块,只需凭借区块头中的根哈希,就能验证某笔交易是否真的存在于某个区块中
收据树(Receipt Trie)
作用
收据树存储的是每笔交易执行后的结果回执,交易执行后会产生哪些日志、消耗了多少 Gas、是否执行成功,这些信息都记录在收据树中。
- 键:与交易树对应,同样是交易的序号
- 值:交易回执,主要包含:
- 交易执行后的状态(成功或失败,如 EIP-658 引入的状态码)
- 交易消耗的累计 Gas(Cumulative Gas Used)
- 交易过程中产生的日志(Logs),例如合约触发的事件(Event)
- Bloom 过滤器:由日志信息生成的过滤器,可快速判断某交易是否包含特定日志,而无需读取完整回执
关键特点
- 收据树的根哈希(receiptsRoot)存储在区块头中
- 与交易树一样,收据树在区块生成后不可修改
- 日志功能对 DApp 开发至关重要:前端应用和区块链浏览器正是通过查询日志来监听智能合约事件(如转账、铸造 NFT 等)
- Bloom 过滤器让轻节点能高效地检索与特定地址或主题相关的事件
三种树的核心区别对比
| 维度 | 状态树 | 交易树 | 收据树 |
|---|---|---|---|
| 范围 | 全局唯一 | 每个区块一棵 | 每个区块一棵 |
| 键 | 账户地址哈希 | 交易序号 | 交易序号 |
| 值 | 账户状态 | 交易详情 | 交易执行回执 |
| 可变性 | 随交易不断更新 | 区块生成后不可变 | 区块生成后不可变 |
| 根哈希字段 | stateRoot | transactionsRoot | receiptsRoot |
| 主要用途 | 查询余额与合约状态 | 验证交易存在性 | 查询执行结果与事件日志 |
这种设计的意义
以太坊为什么要在每个区块头中同时保存三个树的根哈希?这体现了精妙的系统设计:
支持轻节点(SPV)验证 轻节点只需下载区块头(包含三个根哈希),就能通过默克尔证明验证:
- 某个账户的当前余额(状态树证明)
- 某笔
The End
发布于:2026-09-18,除非注明,否则均为原创文章,转载请注明出处。
