以太坊三大树的基石,状态树/交易树与收据树的区别与作用
在以太坊区块链的复杂架构中,有三个核心的数据结构,它们都以“树”(Tree)的形式存在,共同构成了以太坊数据存储和检索的基石,它们分别是状态树(State Tree)、交易树(Transactions Tree) 和收据树(Receipts Tree),虽然它们都借鉴了Merkle Patricia Trie(MPT,Merkle Patricia前缀树)这一高效数据结构,但它们各自承载着截然不同的功能,对于理解以太坊的运作至关重要,本文将详细探讨这三棵树的区别。
状态树(State Tree):世界状态的“总账”
定义与作用: 状态树,有时也被称为“世界状态树”(World State Tree),是记录以太坊当前所有账户状态的“总账”,这里的“账户”包括外部账户(EOA,由用户私钥控制的账户)和合约账户,状态树存储了每个账户的关键信息,如 nonce(交易次数)、balance(余额)、storageRoot(合约存储树的根哈希,指向合约的存储数据)和codeHash(合约代码的哈希)。
状态树回答了这样一个问题:“在当前这一刻,以太坊上每一个账户的状态是怎样的?”
特点:
- 动态性: 状态树是动态变化的,每当有新的交易被确认并执行,改变了账户的状态(转账改变了余额,合约调用了合约函数),状态树就会相应地更新。
- 全局性: 它包含了整个以太坊网络中所有账户的状态信息,是整个“世界状态”的缩影。
- 根哈希标识: 状态树的根哈希值被包含在每个区块的头部(Block Header)中,这意味着,任何对世界状态的微小改动,都会导致区块头哈希的变化,从而保证了状态的不可篡改性,验证者可以通过比较状态树根哈希来快速验证状态的一致性。
交易树(Transactions Tree):交易历史的“索引”
定义与作用: 交易树,顾名思义,是存储某个区块内所有交易列表的Merkle Patricia Trie,它按顺序排列了该区块包含的所有交易数据(或交易数据的哈希值)。
交易树的作用是为区块内的交易提供一种高效的验证和检索机制,它回答了这样一个问题:“在这个特定的区块里,发生了哪些交易?这些交易是如何排列的?”
特点:
- 区块级关联: 每个区块都有自己独立的交易树,仅包含该区块内的交易。
- 顺序性: 交易树的构建依赖于交易在区块中的顺序,这保证了交易的确定性执行顺序。
- 根哈希标识: 交易树的根哈希同样被包含在区块头部,这使得任何人都可以通过计算交易树的根哈希来验证区块中交易列表的完整性和顺序性,而无需下载所有交易数据。
收据树(Receipts Tree):交易结果的“报告”
定义与作用: 收据树是存储某个区块内所有交易执行结果(即收据)的Merkle Patricia Trie,收据(Receipt)是交易执行后生成的“收据”或“回执”,它本身不是交易数据,而是交易执行的状态和结果的记录。
每个收据包含以下关键信息:
- status: 交易执行是否成功(1表示成功,0表示失败)。
- cumulativeGasUsed: 该区块中到此交易为止累计消耗的gas总量。
- logsBloom: 布loom过滤器,用于快速查询该交易产生的日志(Logs)。
- logs: 交易产生的日志列表,这是事件驱动应用(如DeFi、NFT)的重要数据来源。

收据树回答了这样一个问题:“这个交易执行后,结果如何?成功了还是失败了?消耗了多少gas?产生了哪些日志事件?”
特点:
- 区块级关联: 类似于交易树,每个区块也有自己独立的收据树,包含该区块内所有交易的收据。
- 结果导向: 收据树记录的是交易的执行结果,而非交易本身,这对于轻客户端(如手机钱包)尤为重要,它们可以通过验证收据来了解交易结果,而无需重新执行交易。
- 根哈希标识: 收据树的根哈希同样被记录在区块头部,这使得验证交易结果和日志的完整性变得高效。
- 事件驱动的基础: 合约产生的事件(Logs)被记录在收据中,收据树使得这些事件可以被高效地索引和查询,是构建去中心化应用事件系统的基础。
三棵树的核心区别总结
为了更清晰地理解,我们可以通过一个表格来对比这三棵树的区别:
| 特性 | 状态树 (State Tree) | 交易树 (Transactions Tree) | 收据树 (Receipts Tree) |
|---|---|---|---|
| 以太坊所有账户的当前状态(余额、nonce、代码等) | 区块内包含的所有交易数据(按顺序) | 区块内所有交易执行后的结果(状态、gas消耗、日志等) | |
| 对应范围 | 整个以太坊网络(全局状态) | 单个区块 | 单个区块 |
| 变化频率 | 每个有效区块都会更新(动态) | 每个新区块创建时更新(包含新区块交易) | 每个新区块创建时更新(对应新区块交易结果) |
| 核心作用 | 记录“世界状态”,反映当前账户情况 | 记录“交易历史”,索引区块内交易 | 记录“交易结果”,提供执行状态和事件日志 |
| 区块头中的标识 | 状态树根哈希 | 交易树根哈希 | 收据树根哈希 |
| 可以回答的问题 | “这个账户现在有多少余额?” | “这个区块里有哪些交易?” | “这笔交易成功了吗?产生了什么事件?” |
| 类比 | 整个国家的户籍登记系统 | 某个城市某一天的交通事故记录列表 | 每起交通事故的处理报告和结果 |
协同工作:以太坊数据完整性的保障
这三棵树并非孤立存在,它们通过区块头紧密地联系在一起,共同保障了以太坊数据的完整性、可验证性和高效性,区块头通过包含这三棵树的根哈希,实际上是对整个区块的状态、交易和交易结果进行了“指纹”记录,任何对历史数据的篡改,都必然会导致这些树的结构变化,进而使得区块头哈希不匹配,从而被网络迅速识别和拒绝。
当你想验证一笔历史交易是否成功时,你可以:
- 找到包含该交易的区块。
- 验证区块头中的交易树根哈希,确认交易列表未被篡改。
- 验证区块头中的收据树根哈希,然后根据交易在区块中的位置,在收据树中找到对应的收据,确认其执行状态和日志。
状态树、交易树和收据树是以太坊区块链数据模型的三大支柱,状态树描绘了“的世界全貌,交易树记录了“过去”发生的具体行为,而收据树则提供了这些行为“结果”的证明,理解这三棵树的区别与联系,是深入掌握以太坊工作机制、区块链数据结构以及构建高效去中心化应用的关键一步,它们共同以Merkle Patricia Trie的形式,确保了以太坊数据的高效存储、快速检索和不可篡改,为区块链的信任基础奠定了坚实的根基。