以太坊,作为全球领先的智能合约平台和去中心化应用(DApps)的生态系统,其背后有一套复杂而精密的数据结构设计来确保安全性、完整性和高效性,三种被称为“树”的数据结构——状态树(State Tree)、交易树(Transactions Tree)和收据树(Receipts Tree)——构成了以太坊数据存储和验证的基石,它们共同协作,记录了网络上的所有关键信息,并为轻客户端等提供了高效的数据验证途径。
下面,我们将详细介绍这三种树的结构及其在以太坊中的核心作用。
状态树(State Tree)
状态树是以太坊中最为核心和复杂的树,它记录了以太坊在特定时间点的全局状态,这个“全局状态”可以理解为一个巨大的数据库,包含了所有账户(包括外部账户和合约账户)的信息。
-
数据存储内容:
- 外部账户(EOA):账户余额(balance)、nonce(交易发送次数)、代码(如果存在,但EOA通常没有)。
- 合约账户:存储的代码(code)、存储的数据(storage)、balance、nonce。
- 简而言之,状态树保存了每一个账户在特定区块被确认后的所有相关信息。
-
树结构特点:
- 它是一个Merkle Patricia Trie(MPT,梅克尔帕特里夏树),这种结合了Merkle Tree和Patricia Tree优化的数据结构,能够高效地存储和检索键值对,并且支持快速的状态验证和部分状态同步。
- 树的根哈希(State Root)被包含在每个区块的头部中,这个根哈希是整个状态树所有数据哈希运算后的最终结果,任何微小的状态变化都会导致根哈希的改变。

-
核心作用:
- 状态快照:为以太坊提供了一个特定时刻的全局状态视图。
- 高效验证:通过状态根哈希,任何节点都可以快速验证某个账户状态是否属于当前有效状态,而无需下载整个状态树。
- 数据一致性:确保了网络中所有节点对当前状态达成共识。
交易树(Transactions Tree)
交易树记录了在某个区块中被包含的所有交易列表及其顺序。
-
数据存储内容:
- 区块中的每一笔完整交易数据(包括发送方、接收方、金额、数据、签名等)。
- 按照交易在区块中被打包的顺序排列。
-
树结构特点:
- 同样采用Merkle Patricia Trie(MPT)结构。
- 其根哈希(Transactions Root)也被包含在区块头部中。
-
核心作用:
- 交易完整性证明:通过交易树的根哈希,可以证明某笔交易确实被包含在某个特定的区块中,这是轻客户端验证交易存在性的关键。
- 交易顺序追溯:确保了区块内交易的顺序是不可篡改的。
- 数据审计:方便用户和开发者追溯历史交易记录。
收据树(Receipts Tree)
收据树记录了区块中每笔交易执行后所产生的收据(Receipt),收据本身不是交易结果,而是交易执行结果的“回执”或“证明”。
-
数据存储内容:
- 状态码(Status):表示交易是否成功执行(例如1表示成功,0表示失败)。
- 累计 gas 使用量(Cumulative Gas Used):从区块第一笔交易到当前交易执行完毕所消耗的总 gas 量。
- 日志 Bloom 过滤器(Logs Bloom):用于快速定位交易产生的日志事件。
- 日志(Logs):合约执行过程中触发的日志事件数组,包含日志地址、主题列表和数据,这对于 DApps 的事件监听至关重要。
-
树结构特点:
- 同样是Merkle Patricia Trie(MPT)。
- 其根哈希(Receipts Root)同样被包含在区块头部中。
-
核心作用:
- 交易执行结果证明:证明某笔交易是否被执行、执行结果如何(成功/失败)、以及是否触发了特定日志,这对于需要知道交易处理结果的 DApps 至关重要。
- 事件日志索引与查询:通过 Logs Bloom 和收据树,可以高效地查询特定合约产生的历史事件。
- 轻客户端支持:轻客户端可以通过验证收据树来确认交易的执行结果,而无需重新执行交易。
三位一体的数据守护者
状态树、交易树和收据树是以太坊数据模型的三大支柱,它们各自承担着不同的职责,又通过区块头中的根哈希紧密地联系在一起:
- 状态树守护着“世界当前的状态”。
- 交易树记录了“区块内发生了哪些交易”。
- 收据树则提供了“这些交易执行的结果如何”。
这三种梅克尔帕特里夏树的巧妙设计,使得以太坊能够在保证数据完整性、不可篡改性的同时,实现高效的状态同步、数据验证和轻客户端支持,为构建一个去中心化、可信的数字世界奠定了坚实的技术基础,理解这三种树,是深入理解以太坊工作机制的重要一步。







