在以太坊的技术讨论中,常听到“三种树”的说法——有人说是“状态树、交易树、收据树”,也有人提到“Merkle树、 Patricia树、Merkle Patricia树”,让人不禁困惑:以太坊到底有几种树?这些树之间是什么关系?这并非概念混淆,而是以太坊底层设计中不同维度的分类,本文将从“功能树”和“数据结构树”两个维度,拆解以太坊的“三种树”究竟指什么,以及它们如何支撑整个网络的运行。
先明确:以太坊的“三种树”通常指哪三棵
在大多数技术语境下,以太坊的“三种树”指的是状态树(State Tree)、交易树(Transaction Tree)和收据树(Receipt Tree),这三棵树共同构成了以太坊“默克尔化帕特里夏前缀树(Merkle Patricia Trie, MPT)”的核心结构,是以太坊状态数据存储和验证的基石。
它们的功能分工非常明确:
- 状态树:记录整个以太坊网络中每个账户的实时状态(如余额、nonce、代码存储等),可以理解为“以太坊的账本”,存储了所有账户的当前信息。
- 交易树:存储区块中的所有交易数据,每笔交易按顺序排列并默克尔化,方便快速验证交易是否存在。
- 收据树:存储每笔交易的执行结果(如是否成功、日志输出等),用于轻客户端和DApp查询交易历史状态。
这三棵树共同构成了以太坊区块的“默克尔证明”基础,确保数据不可篡改且可高效验证。
深入解析:三棵树的功能与关系
状态树(State Tree):以太坊的“动态账本”
状态树是以太坊最核心的数据结构之一,它是一个Merkle Patricia Trie(默克尔化帕特里夏前缀树),存储了网络中所有账户的状态,每个账户由地址唯一标识,状态包括:
- 余额(balance)
-Nonce(账户发起的交易次数) - 代码存储(code,智能合约的字节码)
- 存储根(storage root,合约内部数据的默克尔根)
为什么需要状态树?
以太坊是一个“状态机”,每个区块的生成都是对前一个状态的“转换”,状态树将所有账户状态组织成树形结构,通过“默克尔化”特性,可以实现:
- 高效验证:轻客户端只需下载状态树的根哈希(StateRoot),即可验证某个账户状态的真实性,无需同步全量数据。

- 防篡改:任何账户状态的修改都会导致状态根变化,恶意篡改数据会立即被检测到。
当你发送一笔ETH转账时,交易会修改你和接收方的余额,状态树会更新这两个账户的状态,并生成新的状态根,写入区块头。
交易树(Transaction Tree):区块的“交易记录清单”
交易树存储的是单个区块内的所有交易数据,同样采用Merkle Patricia Trie结构,每个区块包含一定数量的交易(如以太坊当前每区块约15000笔),交易树将这些交易按顺序排列,计算各自的哈希值,再逐层组合成最终的交易根(Transaction Root)。
交易树的作用是什么?
- 交易存在性证明:用户可以通过交易根验证某笔交易是否确实被包含在某个区块中,交易所需要验证用户的充值交易,只需提供交易哈希和区块的交易根,即可快速验证,无需同步整个区块。
- 顺序保证:交易树按交易顺序排列,确保了区块内交易的执行顺序不可篡改(虽然以太坊的最终顺序由Gas价格等因素决定,但树的结构记录了打包时的顺序)。
需要注意的是,交易树只存储交易数据本身(如发送方、接收方、金额、Gas限制等),不存储执行结果——执行结果由收据树记录。
收据树(Receipt Tree):交易的“执行结果报告”
收据树是三棵树中最容易被忽略但同样重要的部分,它存储了每笔交易的执行结果,包括:
- 状态码(status,1表示成功,0表示失败)
- 消耗的Gas(gas used)
- 日志条目(logs,智能合约触发的事件,常用于DApp监听)
- 其他元数据(如区块号、交易索引等)
收据树同样采用Merkle Patricia Trie结构,生成收据根(Receipt Root),并写入区块头。
收据树的意义在于:
- 轻客户端查询:轻客户端无需下载完整区块,只需通过收据根即可验证交易是否成功、是否触发了特定日志(DeFi项目需要验证用户的存款交易是否成功,可通过收据树快速确认)。
- DApp交互:许多DApp依赖交易日志实现功能(如事件监听、状态更新),收据树提供了高效的历史日志查询方式。
当你调用一个智能合约函数时,如果交易成功,收据树会记录返回的日志;如果失败,收据树的状态码会标记为0,方便你快速定位问题。
为什么会有“Merkle树、Patricia树、Merkle Patricia树”的说法
除了上述三棵“功能树”,以太坊的数据结构中还常提到“Merkle树”“Patricia树”和“Merkle Patricia树”,这其实是数据结构维度的分类,与三棵功能树并非同一层级的概念。
Merkle树(默克尔树):基础“信任机制”
Merkle树是一种二叉树结构,通过将大量数据的哈希值两两组合,逐层计算最终得到一个“根哈希”(Merkle Root),其核心作用是高效验证数据的完整性和存在性:只需根哈希,即可验证任意子数据是否属于该集合,且无需下载全量数据。
比特币的区块就用Merkle树组织交易数据,验证一笔交易是否存在,只需提供交易哈希和Merkle Root即可,无需同步整个区块的数千笔交易。
Patricia树(帕特里夏前缀树):优化存储的“压缩树”
Patricia树(前缀树的一种)是一种压缩前缀树,通过共享公共前缀减少存储空间和查询时间,与普通前缀树相比,Patricia树更适合存储稀疏、长键的数据(如以太坊的账户地址,地址长度为20字节,但实际分布稀疏)。
Merkle Patricia树(MPT):以太坊的“终极组合”
以太坊并未单独使用Merkle树或Patricia树,而是将两者结合,设计了Merkle Patricia Trie(MPT),这种结构同时具备:
- Merkle树的验证优势:通过根哈希实现数据完整性证明。
- Patricia树的存储优势:共享前缀,节省存储空间,提高查询效率。
以太坊的状态树、交易树、收据树本质上都是Merkle Patricia Trie,只是存储的数据内容不同。
以太坊的“三种树”是什么关系
回到最初的问题:以太坊有三种树吗?答案是:“功能树”有三种(状态树、交易树、收据树),“数据结构树”是一种(Merkle Patricia Trie),三棵功能树均基于同一种数据结构构建。
- 状态树 = 账户状态的“MPT”
- 交易树 = 区块交易的“MPT”
- 收据树 = 交易结果的“MPT”
这三棵树共同构成了以太坊的“数据完整性三角”:状态树确保账户数据真实,交易树确保交易记录可验证,收据树确保执行结果可追溯,而Merkle Patricia Trie作为底层数据结构,为这三棵树提供了高效、安全、可扩展的存储和验证能力。
下次再听到“以太坊有三种树”,你可以明确:这指的是状态树、交易树、收据树三棵功能树,它们共同支撑着以太坊作为“世界计算机”的运行基础。