以太坊的三种树,深入理解区块链世界的默克尔森林

博主:neragonerago 2026-10-01 05:27:26 1

以太坊作为全球最大的智能合约平台,其底层数据结构的设计堪称精妙,在以太坊的世界里,有三棵至关重要的“树”(Trie),它们支撑着整个区块链的运转:状态树(State Trie)、交易树(Transaction Trie)和收据树(Receipt Trie),理解这三棵树,是理解以太坊架构的关键一步。

基础知识:什么是默克尔帕特里夏树(MPT)

在介绍三棵树之前,需要先了解它们共同的底层数据结构,默克尔帕特里夏树(Merkle Patricia Trie,简称 MPT)。

以太坊结合了两种数据结构的优点:

  • 默克尔树(Merkle Tree):通过密码学哈希将数据组织成树状结构,任何人只需一个根哈希,就能通过“默克尔证明”验证某条数据是否存在于树中,而无需下载全部数据。
  • 帕特里夏树(Patricia Trie):一种前缀压缩树,能高效地存储和查询键值对,减少存储空间。

MPT 中的所有数据都经过 RLP 编码(递归长度前缀编码)和 Keccak-256 哈希处理,保证了数据的完整性和可验证性。

第一棵树:状态树(State Trie)

定义与作用

状态树是整个以太坊全局状态的记录者,它维护着所有账户的当前状态,包括:

  • 外部账户(EOA):普通用户账户,包含 nonce(交易计数器)和 balance(余额)
  • 合约账户:除了 nonce 和 balance,还包含 storageRoot(存储树根)和 codeHash(合约代码哈希)

数据结构

状态树的键是账户地址经过 Keccak-256 哈希后的值,值则是经过 RLP 编码的账户信息。

特点

  • 动态更新:每笔改变状态的交易(如转账、调用合约)都会触发状态树的更新
  • 规模庞大:以太坊运行多年,账户数以亿计,状态树是三棵树中最大的
  • 根哈希上链:状态树的根哈希(stateRoot)记录在每个区块头中,任何状态篡改都会导致根哈希不匹配,从而被发现

补充:每个合约账户内部还有自己的存储树(Storage Trie),用于保存合约变量的数据,可以看作状态树的“子树”。

第二棵树:交易树(Transaction Trie)

定义与作用

交易树记录了每个区块内包含的所有交易,每当一个新区块产生,矿工(或验证者)就会将该区块中的所有交易组织成一棵交易树。

数据结构

  • 键:交易的索引号(RLP 编码),如 0、1、2……
  • 值:完整的交易数据(发送者、接收者、金额、 gas 限制、签名等)

特点

  • 不可变性:一旦区块上链,其中的交易就永远固定,交易树不再改变
  • 根哈希上链:交易树的根哈希(transactionsRoot)记录在区块头中
  • 支持轻节点验证:轻客户端无需下载整个区块,只需通过默克尔证明就能验证某笔交易是否存在于某个区块中,这就是所谓的 SPV(简单支付验证)

第三棵树:收据树(Receipt Trie)

定义与作用

收据树记录了每笔交易执行后的结果,即“交易回执(Receipt)”,它回答了这样一个问题:这笔交易执行得怎么样?

收据包含的信息

  • 状态码(status):交易成功(1)还是失败(0)
  • 累计消耗 Gas(cumulativeGasUsed):区块中截至该交易的 Gas 总消耗
  • 日志(Logs):合约触发的事件,如转账事件、代币转移事件等
  • 布隆过滤器(LogsBloom):用于快速检索日志的位图结构

特点

  • 键值结构:与交易树类似,键为交易索引,值为 RLP 编码的收据数据
  • 与交易树一一对应:第 N 笔交易的收据,就存放在收据树的第 N 个位置
  • 根哈希上链:收据树的根哈希(receiptsRoot)同样记录在区块头中
  • 服务于 DApp 生态:钱包和 DApp 展示的交易状态、事件日志,都依赖收据树

三棵树的对比总结

| 特性 | 状态树 | 交易树 | 收据树 | |------|--------|--------|--------|| 全部账户的当前状态 | 区块内的所有交易 | 交易执行的结果 | | 键 | 账户地址哈希 | 交易索引 | 交易索引 | | 生命周期 | 持续动态更新 | 随区块固定不变 | 随区块固定不变 | | 数量 | 全网仅一棵活跃状态树 | 每个区块一棵 | 每个区块一棵 | | 根哈希字段 | stateRoot | transactionsRoot | receiptsRoot | | 主要作用 | 维护全局状态 | 证明交易存在 | 证明交易结果 |

三棵树的协同运作

一个完整的交易流程,贯穿了这三棵树:

  1. 用户发起一笔转账交易,交易被打包进区块,写入交易树
  2. 交易执行后,账户余额发生变化,状态树随之更新
  3. 交易执行的结果被记录为收据,写入收据树
  4. 三棵树的根哈希全部写入区块头,等待下一个区块
The End

发布于:2026-10-01,除非注明,否则均为区块链社区- 欧亿APP下载原创文章,转载请注明出处。