以太坊有三种树吗?——解密以太坊底层的三大默克尔树结构
在区块链的世界里,以太坊无疑是最具影响力的智能合约平台之一,很多人了解以太坊的账户、Gas、智能合约,但当你深入到以太坊的底层 数据结构时,会发现一个有趣的概念——“树”,以太坊真的有三种树吗?答案是:有的,以太坊的核心数据结构由三种默克尔树(Merkle Tree)构成,分别是状态树(State Trie)、交易树(Transaction Trie)和收据树(Receipt Trie),本文将带你深入了解这三种树的作用与设计精髓。
什么是默克尔帕特里夏树(MPT)?
在讲三种树之前,先要了解它们共同的基础结构,默克尔帕特里夏树(Merkle Patricia Trie,简称 MPT)。
这是一种融合了两种数据结构优点的混合体:
- 默克尔树(Merkle Tree):通过哈希将大量数据组织成树状结构,任何一个数据的改动都会导致根哈希(Root Hash)发生变化,从而可以快速验证数据的完整性和一致性。
- 帕特里夏树(Patricia Trie):一种压缩前缀树,能够高效地进行键值对的插入、删除和查询。
以太坊将两者结合,得到了一种既可验证、又高效检索的数据结构,上述三种树,本质上都是 MPT。
第一种树:状态树(State Trie)
状态树是三种树中最重要的一个,它记录了以太坊全球所有账户的当前状态。
- 键(Key):账户地址经过 keccak256 哈希后的值
- 值(Value):经过 RLP 编码的账户数据,包括:
- Nonce:该账户已发送的交易数量
- Balance:账户余额
- storageRoot:存储树的根哈希(合约账户专属)
- codeHash:合约代码的哈希
状态树的最大特点是可变——每执行一笔交易,相关账户的余额、Nonce 等都可能发生变化,状态树随之更新,并生成新的状态根(State Root),写入区块头中。
举个例子:当你向朋友转账 1 ETH 时,你和他账户的余额都会改变,状态树中对应的叶子节点被更新,整棵树的根哈希也随之改变。
第二种树:交易树(Transaction Trie)
交易树记录了一个区块内所包含的全部交易。
- 键(Key):交易的序号(索引值,经 RLP 编码)
- 值(Value):具体的交易数据,如发送者、接收者、金额、Gas 价格等
交易树有一个显著特点:不可变(Immutable),一旦区块被打包上链,其中的交易顺序和内容就永远固定下来,交易树也不会再发生任何变化。
通过交易树,轻节点(Light Node)只需下载区块头,就能借助默克尔证明验证某笔交易是否真的存在于某个区块中,而无需下载完整的区块链数据。
第三种树:收据树(Receipt Trie)
收据树记录了每笔交易执行后的“回执”信息。
- 键(Key):交易的序号(与交易树对应)
- 值(Value):交易执行的结果数据,主要包括:
- 交易执行状态(成功或失败,即状态码 status)
- 消耗的 Gas 数量
- 交易过程中产生的日志(Logs)——这是智能合约触发事件(Event)的载体
收据树同样具有不可变性,它最重要的应用场景是日志查询:DEX(去中心化交易所)查询历史成交记录、钱包查询转账历史,背后依赖的正是收据树中的日志数据。
三种树如何协同工作?
在一个区块的生命周期中,这三种树密切配合:
- 矿工(或验证者)从交易池中取出交易,打包进区块;
- 逐笔执行交易,形成交易树;
- 执行过程中生成每笔交易的回执,形成收据树;
- 所有账户状态被更新,形成新的状态树;
- 三棵树的根哈希(stateRoot、transactionsRoot、receiptsRoot)全部写入区块头。
任何人都可以通过对比根哈希,来验证一份数据是否与全网共识一致——这正是去中心化网络中“无需信任、只需验证”的基石。
延伸思考:真的只有三种树吗?
如果算上每个合约账户自己的存储树(Storage Trie)——记录合约内部的所有变量状态——以太坊的树远不止三棵,不过业界习惯上所说的“三种树”,指的就是区块层面的状态树、交易树和收据树,存储树通常被视为状态树的延伸。
以太坊执行层客户端(如 Geth)目前也在用更先进的默克尔布什树(MPT 的替代方案)等方案探索更高效的存储结构,这是后话。
回到最初的问题:以太坊有三种树吗?答案是肯定的。状态树记录“世界现在是什么样”,交易树记录“这个区块做了什么”,收据树记录“做完的结果如何”,三棵树共同支撑起了以太坊的状态验证、交易证明和日志查询三大核心功能。
理解了这三种树,你不仅看懂了以太坊的数据底层,也更能体会区块链设计中“数据结构即信任机制”的精妙哲学。
发布于:2026-10-01,除非注明,否则均为原创文章,转载请注明出处。
