-
在区块链的世界里,以太坊以其智能合约功能和图灵完备性而著称,支撑其复杂运行的核心,除了共识机制和虚拟机,还有一套精妙且高效的数据结构——三棵树(Three Trees of Ethereum),也常被称为“状态树、交易树、收据树”,这三棵默克尔树共同构成了以太坊世界状态和交易历史的可信、可验证的基石,确保了数据的完整性、一致性和高效查询。

三棵树的概览:以太坊的数据“账本”
想象一下,以太坊的状态就像一个巨大的分布式数据库,记录了网络上所有账户的余额、合约代码、存储数据等信息,而每一笔交易,都会可能改变这个状态,三棵树的作用就是:
- 状态树(State Tree / World State Tree):记录以太坊在某个特定区块被创建后,整个网络的全局状态,包括所有外部账户(EOA)的 nonce、balance、codeHash,以及所有合约账户的 storageRoot、codeHash 等。
- 交易树(Transactions Tree):记录某个特定区块内包含的所有交易列表,每一笔交易都有其唯一的内容,这些内容被组织成一颗默克尔树。
- 收据树(Receipts Tree):记录某个特定区块内所有交易执行后产生的收据(Receipt),收据包含了交易的执行结果,例如是否成功、使用了多少 gas、日志(Log)等。
这三棵树,再加上区块头中记录的它们各自的根哈希值(State Root, Transactions Root, Receipts Root),共同构成了区块头的关键信息,这意味着,通过验证区块头的这些根哈希,就可以高效地验证整个区块的状态和交易历史是否被篡改。
默克尔树:三棵树的共同基石
在深入了解每棵树之前,必须先理解它们共同的数据结构——默克尔树(Merkle Tree),也称为哈希树。

默克尔树是一种二叉树或多叉树,其特点是:
- 叶节点(Leaf Nodes):存储数据块的实际内容(账户状态的 RLP 编码结果、单笔交易的原始数据、单笔交易的收据)。
- 非叶节点(Non-Leaf Nodes):其哈希值由其子节点的哈希值组合后再次哈希计算得出。
- 根节点(Root Node):位于树的最顶端,其哈希值代表了整棵树所有数据的唯一“指纹”,只要任何一个叶节点的数据发生改变,根节点的哈希值就会随之改变。
默克尔树的核心优势在于高效验证和完整性证明,要证明某个交易存在于某个区块中,不需要下载整个区块的所有交易,只需要提供该交易到根节点路径上的少量哈希值即可快速验证,这在轻客户端(如手机钱包)中尤为重要。
状态树(State Tree):以太坊的“世界状态”
状态树是三棵树中最庞大、最核心的一棵,它记录了以太坊在某个时刻的所有账户信息。
- 组织方式:以太坊中的每个账户都有一个唯一的地址,这些地址作为键(Key),对应的账户状态(包括 balance, nonce, codeHash, storageRoot 等)作为值(Value),这些键值对被 RLP 编码后,作为叶节点插入到状态树中。
- 动态更新:每当一笔交易执行并改变了账户状态(转账改变了两个账户的余额,或者合约部署/调用了合约),状态树就会相应地更新,更新后,状态树的根哈希值(State Root)也会改变,并被记录在新区块的区块头中。
- 存储树(Storage Tree):值得注意的是,合约账户的存储数据(storage)并不是直接放在状态树的叶节点中,而是每个合约账户对应一颗独立的存储树,状态树中合约账户的
storageRoot 字段,就是这颗存储树的根哈希值,这种设计使得每个合约的存储空间独立且可扩展。
交易树(Transactions Tree):区块内的“交易流水”

交易树相对简单直接。
- 组织方式:一个区块包含的所有交易,按照它们被打包进入区块的顺序,依次作为叶节点插入到交易树中,每个叶节点存储的是单笔交易的原始 RLP 编码数据。
- 作用:通过交易树的根哈希(Transactions Root),可以快速验证一个区块中包含的所有交易列表是否完整且未被篡改,轻客户端可以通过验证某笔交易的哈希是否存在于交易树中,来确认该交易已被包含在某个区块中。
收据树(Receipts Tree):交易的“执行回执”
收据树记录了每笔交易的执行结果,这对于智能合约的交互和事件监听至关重要。
- 组织方式:一个区块中的每一笔交易,执行后都会生成一个收据,这些收据按照与交易对应的顺序,作为叶节点插入到收据树中。
- :收据通常包含以下信息:
status:交易执行是否成功(0x1 表示成功,0x0 表示失败)。
cumulativeGasUsed:到当前交易为止,区块中已使用的累计 gas 量。
logsBloom:布隆过滤器,用于快速判断某个地址或主题的事件日志是否包含在此收据中。
logs:交易触发的事件日志列表,每个日志包含地址、主题列表和数据。
- 作用:收据树使得用户(尤其是轻客户端)可以无需重新执行交易,就能验证交易的结果和事件日志,这对于 DApp 的事件监听、交易所充值提现确认等场景非常重要。
三棵树的协同工作:保障以太坊的安全与高效
这三棵树并非孤立存在,而是紧密协同,共同维护着以太坊的运行:
- 新区块产生:矿工/验证者收集待打包的交易。
- 交易执行:以太坊虚拟机(EVM)按顺序执行这些交易,每执行一笔交易,可能会更新状态树(改变账户状态或合约存储),并生成一个收据。
- 构建三棵树:所有交易执行完毕后,将:
- 更新后的全局状态构建成新的状态树,得到新的
State Root。
- 区块内的所有交易列表构建成交易树,得到
Transactions Root。
- 所有交易生成的收据列表构建成收据树,得到
Receipts Root。
- 打包区块:将这三个根哈希值以及其他区块头信息(如前区块哈希、时间戳、难度、gas 限制等)打包成新区块,并尝试将其添加到区块链上。
- 验证与同步:其他节点在验证新区块时,会重新执行交易(或使用某些验证优化),计算出的
State Root、Transactions Root 和 Receipts Root 必须与区块头中记录的一致,否则区块将被拒绝,轻客户端则可以通过验证默克尔证明来确认特定交易或状态的存在。
-