在知乎等中文技术社区,我们经常能看到一些关于以太坊底层技术的高频提问,其中有一个问题尤其具有代表性:“以太坊有三种树吗?” 这个问题的答案,既不是简单的“是”,也不是简单的“否”,它触及了以太坊数据模型的核心,也暴露了初学者在学习路径上容易遇到的混淆点。
我们就来深入探讨一下这个问题,彻底搞清楚以太坊究竟“种”了几棵“树”。
“三种树”说法的来源:没错,是三种!
我们必须承认,“以太坊有三种树”这个说法并非空穴来风,它源于以太坊的黄皮书(Ethereum Yellow Paper)中对状态存储模型的精确描述,这三种树分别是:
- 状态树
- 交易树
- 收据树
这三棵树共同构成了以太坊中一个“区块”的核心数据结构,它们都是Merkle Patricia Trie (MPT,默克尔帕特里夏树) 的具体实例,你可以把它们想象成一个大仓库(区块)里的三个不同功能的货架,每个货架都用自己的独特方式(哈希算法)来整理和标记货物。
状态树 - 世界状态的“总账本”
- 作用:这是以太坊最重要的一棵树,它记录了整个以太坊网络在某个特定时刻的全球状态,这个状态包括了所有账户的余额、代码、存储内容等。
- 每个账户(无论是外部账户EOA还是合约账户)在状态树中都对应一个叶子节点,树的根哈希值(State Root)被写入区块头中,它代表了整个世界状态的“指纹”,只要根哈希不变,就意味着全球状态没有发生改变。
- 比喻:它就像一个国家的“不动产登记中心”或“中央银行的总账”,记录了谁拥有多少钱,谁有什么智能合约。
交易树 - 区块内交易的“流水账”
- 作用:这棵树记录了当前区块内包含的所有交易的具体数据。
- 区块里的每一笔交易都是这棵树的一个叶子节点,通过这棵树,我们可以完整地、不可篡改地追溯一个区块内的所有交易顺序和内容。
- 比喻:它就像是这个区块的“银行流水单”或“会议记录”,清晰地列出了本区块内发生的所有操作。
交易收据树 - 交易结果的“回执单”
- 作用:这棵树是初学者最容易混淆的一棵,它不记录交易本身,而是记录每笔交易执行后的结果</strong>。

- 每一笔交易都会生成一个收据,这个收据包含了交易执行状态(成功/失败)、消耗的Gas、日志记录(Log)等信息,这个收据被放入交易收据树中。
- 比喻:它就像你去银行办理业务后拿到的“业务回执”或“电子发票”,交易本身是你的“申请”,而收据是银行处理完后的“结果通知”,这对于轻客户端(如手机钱包)来说至关重要,它们无需下载整个状态,只需验证收据树,就能确认交易是否被成功执行。
从区块数据结构的角度来看,说“以太坊有三种树”是完全正确的,它们是Merkle Patricia Trie这个数据结构在以太坊中的三种不同应用场景。
误解的根源:它们都是同一种“树”
为什么说这个答案又不完全准确呢?问题就出在“树”的定义上。
虽然状态树、交易树和收据树在功能上各不相同,但它们在数据结构层面是完全相同的,它们都采用了Merkle Patricia Trie (MPT) 这种特殊的树形结构。
MPT结合了Merkle Tree和Patricia Trie的优点:
- Merkle Tree的特性:确保了数据的完整性和不可篡改性,任何数据的微小改动,都会导致根哈希值的巨大变化。
- Patricia Trie的特性:一种更高效的前缀树,能更紧凑地存储数据,并且支持高效的查询和更新。
- MPT是“模板”或“图纸”:它定义了一种高效、安全的数据组织方法。
- 状态树、交易树、收据树是“成品”:它们都是用MPT这张“图纸”建造出来的,分别用来存放不同类型的数据(世界状态、交易列表、交易结果)。
这就好比你问:“一个建筑工地有几种脚手架?”
- 从功能上说,可能有主体结构用的、装修用的、安全防护用的,好几种。
- 但从本质上说,它们都是“脚手架”这个大类。
同理,从数据结构的本质来看,以太坊在一个区块里主要使用了一种核心数据结构——Merkle Patricia Trie,并用它实例化了三个对象来分别管理状态、交易和收据。
如何向别人解释?
回到最初的问题:“以太坊有三种树吗?”
一个严谨且全面的回答应该是:
“是的,从一个区块的数据组织形式来看,以太坊确实有三种核心的Merkle Patricia Trie,分别是状态树、交易树和收据树,它们分别负责存储世界状态、交易列表和交易执行结果,但从数据结构的本质来看,这三种树都基于同一种名为‘Merkle Patricia Trie’的底层算法实现,可以看作是这一核心数据结构的三种不同应用实例。”
理解这一点,不仅能帮助我们准确回答知乎上的技术问题,更重要的是,它能让我们对以太坊的数据模型有一个更深刻、更本质的认识,下次再有人问起,你就可以自信地、有条理地向他解释清楚“三种树”的由来与它们的共同本质了。