以太坊,作为全球领先的智能合约平台,其底层架构的精妙设计是支撑其安全、透明和可扩展性的关键,状态存储模型是核心组成部分之一,为了高效、安全地管理全球共享的状态数据,以太坊采用了独特的“三棵树”(Merkle Patricia Trie, MPT)存储结构,即状态树、交易树和收据树,这三棵树共同构成了以太坊世界状态的数据基石,确保了数据的一致性、可验证性和高效检索。

什么是Merkle Patricia Trie (MPT)?

在深入了解三棵树之前,我们首先需要理解它们共同的数据结构基础——Merkle Patricia Trie(Merkle Patricia 前缀树,简称MPT),MPT是一种结合了Merkle树和Patricia Trie(前缀树)优化的数据结构:

  1. Patricia Trie(前缀树):一种树形数据结构,用于高效存储和检索字符串键值对,它通过共享公共前缀来压缩数据,减少了不必要的节点,使得查找、插入和删除操作的平均时间复杂度可以达到O(k),其中k是键的长度。
  2. Merkle Tree(默克尔树):一种哈希树,其中每个非叶子节点都对其子节点的哈希值进行哈希计算,根节点的哈希值(称为Merkle Root)代表了所有数据的唯一“指纹”,任何数据的微小改动都会导致Merkle Root的显著变化,这使得Merkle树非常适合用于验证数据完整性和一致性。

MPT结合了两者的优点:利用Patricia Trie的高效前缀压缩特性来节省存储空间和加快查询速度,同时利用Merkle树的哈希聚合特性来确保数据的不可篡改和高效验证。

以太坊的三棵树详解

以太坊的状态数据主要包含三类,分别由三棵独立的MPT进行管理:

  1. 状态树 (State Tree / World State Tree)

    • 作用:存储以太坊的“世界状态”,即所有账户(外部账户EOA和合约账户)的实时状态,每个账户都有一个唯一的地址作为键,其对应的值是一个包含账户 nonce、余额、代码哈希(对于合约账户)和存储根(对于合约账户)等信息的RLP编码数据。
    • 结构:这是一棵全局唯一的MPT,其根哈希值(State Root)被包含在每个区块的头部,每当账户状态发生变化(如转账、合约执行、账户创建等),状态树就会相应更新,并生成新的State Root。
    • 重要性:状态树是以太坊当前状态的“快照”,它记录了所有账户的实时信息,通过State Root,任何节点都可以快速验证某个区块所包含的世界状态是否正确,无需下载全部状态数据。
  2. 交易树 (Transactions Tree)

    • 作用:存储区块中包含的所有交易信息,每笔交易按照其在区块中的顺序被RLP编码后,作为一个叶子节点插入到交易树中。
    • 结构:同样是一棵MPT,其根哈希值(Transactions Root)也位于区块头部,交易树记录了区块内所有交易的完整列表和顺序。
    • 重要性:交易树提供了区块内交易的不可篡改性和可验证性,任何人都可以通过计算交易树的根哈希与区块头中的Transactions Root进行比较,来验证区块中交易列表的完整性和顺序性。
  3. 收据树 (Receipts Tree)随机配图