在以太坊区块链的复杂架构中,数据的高效存储、验证和安全访问至关重要,为了实现这些目标,以太坊采用了三种核心的树形数据结构,它们共同构成了以太坊状态和交易处理的基石,这三种树分别是默克尔 Patricia 树(Merkle Patricia Trie, 简称 MPT)状态树(State Tree)交易树(Transaction Tree),它们相互协作,确保了以太坊网络的去中心化、安全性和可扩展性。

默克尔 Patricia 树(MPT):高效且可验证的数据索引结构

首先需要明确的是,默克尔 Patricia 树(MPT)并非特指某一种树,而是一种结合了默克尔树(Merkle Tree)Patricia Trie(前缀树)优点的数据结构,它是以太坊中几乎所有“树”的底层实现。

  • Patricia Trie(前缀树):一种 Trie(字典树)的变体,它通过路径压缩的方式,减少了树的深度和节点数量,使得查找、插入和删除操作更加高效,尤其适合存储稀疏数据(即键分布不均匀的数据),在以太坊中,键通常是数据的哈希值或编码后的路径。
  • 默克尔树(Merkle Tree):一种哈希树,其中每个叶子节点是数据块的哈希值,而非叶子节点是其子节点哈希值的哈希值,这种结构能够高效地验证数据是否完整和一致,因为只需要提供从目标节点到根节点的路径(称为“默克尔证明”)即可证明某个数据是否存在或未被篡改。

MPT 的优势在于

  1. 高效性:Patricia Trie 的路径压缩特性使得存储和查询效率很高。
  2. 可验证性:默克尔树的结构使得任何数据的修改都能反映到根哈希的变化,并且可以提供简洁的证明。
  3. 去中心化:每个节点(账户、合约代码、存储等)都可以独立验证,无需信任中央机构。

在以太坊中,状态树、交易树、收据树等都是基于 MPT 构建的。

状态树(State Tree):记录全球账户状态的“总账”

状态树是以太坊中最重要的树之一,它存储了以太坊网络中所有账户(Account)的当前状态。

  • 账户类型:以太坊有两类账户:外部账户(EOA,由用户控制,拥有私钥)和合约账户(由代码控制)。
  • 账户状态数据:每个账户的状态包括:
    • nonce:账户发起的交易数量或创建的合约数量。
    • balance:账户的以太币余额。
    • root:该账户的存储树的根哈希(仅合约账户有)。
    • codeHash:账户合约代码的哈希(仅合约账户有)。
  • 结构:状态树是一个 MPT,其键是账户地址(经过 RLPC 编码),值是对应账户状态的 RLP 编码,整个状态树的根哈希被包含在每个区块的头部,作为区块状态的一个摘要。

状态树的作用

  • 维护全局状态:它是以太坊“世界状态”(World State)的集中体现,记录了网络中所有账户的实时状态。
  • 状态同步与验证随机配图