一文读懂以太坊三棵树,状态树、交易树与收据树的核心区别
在以太坊的世界里,有三位低调却至关重要的“主角”——它们就是状态树(State Trie)、交易树(Transaction Trie)和收据树(Receipt Trie),这三棵树共同构成了以太坊数据存储与验证体系的基石,它们的根哈希都被记录在区块头中,是轻节点验证、Merkle证明等技术得以实现的前提,很多初学者容易混淆这三者的作用,本文将深入剖析它们的核心区别。
共同的技术底座:Merkle Patricia Trie
在展开区别之前,先明确一点:这三棵树都采用同一种数据结构——Merkle Patricia Trie(MPT,默克尔帕特里夏树),MPT 结合了默克尔树的可验证性与帕特里夏树的高效查找能力,具有以下特性: 的改动都会导致根哈希变化,天然具备防篡改能力;
- 支持快速的存在性证明(Merkle Proof)和不存在性证明;
- 通过路径压缩,提高存储与查询效率。
结构相同,但三棵树承载的内容与使命却截然不同。
状态树:全球账户的“总账本”
状态树保存的是以太坊的整个世界状态(World State),它映射了所有账户地址到账户状态的对应关系。
核心特点: 键为账户地址(160位),值为账户信息,包括 nonce(交易计数)、balance(余额)、storageRoot(合约存储根)、codeHash(合约代码哈希)。 2. 范围:包含全网所有账户,无论这些账户在当前区块中是否有交易发生。 3. 持久性:这是三棵树中最关键的区别——状态树不会随着区块重建,而是在原有基础上不断更新、追加与修改,是一个持续演化的全局结构。 4. 体积:由于包含全部账户,状态树极其庞大,这也是以太坊“状态膨胀”问题的根源。
交易树:区块内交易的“清单”
交易树记录的是单个区块内所包含的全部交易。
核心特点: 键为交易的索引号(RLP 编码,如 0、1、2……),值为交易的具体内容(发送方、接收方、金额、gas 等)。 2. 范围:仅包含当前区块的交易,与其他区块无关。 3. 生命周期:每个新区块产生时,交易树都会从零重新构建;一旦区块生成,这棵树便不可修改。 4. 用途:任何人可以通过 Merkle 证明验证“某笔交易确实包含在某个区块中”,这是轻客户端工作的基础。
收据树:交易执行结果的“回执单”
收据树保存的是区块内每笔交易执行后的结果数据。
核心特点: 每张收据包含交易执行后的累计 gas 消耗、执行状态(成功或回滚)、日志(Logs,即合约触发的事件)以及布隆过滤器(Bloom Filter)。 2. 范围与生命周期:与交易树一致,仅针对当前区块,每个区块重建一次。 3. 用途:轻节点无需执行交易,仅凭收据树就能验证事件日志是否真实发生,布隆过滤器让日志检索效率极高,各类区块链浏览器展示的事件数据,源头正是收据树。
核心区别对比一览表
| 维度 | 状态树 | 交易树 | 收据树 |
|---|---|---|---|
| 全网所有账户的状态 | 区块内的所有交易 | 每笔交易的执行结果与日志 | |
| 键(Key) | 账户地址 | 交易索引(RLP编码) | 交易索引(RLP编码) |
| 包含范围 | 全局,所有账户 | 仅限单个区块 | 仅限单个区块 |
| 生命周期 | 持久存在,持续更新 | 每个区块重建一次 | 每个区块重建一次 |
| 可变性 | 频繁增删改 | 建树后不可变 | 建树后不可变 |
| 树根哈希 | stateRoot | transactionsRoot | receiptsRoot |
| 典型用途 | 查询余额、验证账户状态 | 验证交易是否被打包 | 验证事件日志、支持轻节点 |
用一个类比总结
我们可以把以太坊比作一家银行:
- 状态树相当于银行的总账本,记录着所有客户的实时余额,每笔业务发生后都会更新,且永不丢弃;
- **交易树
发布于:2026-10-11,除非注明,否则均为原创文章,转载请注明出处。
