以太坊需要在每个区块中高效表示全局状态(数亿个账户余额、合约存储),同时支持轻客户端用极小的数据量验证任意状态值的正确性。Merkle Patricia Trie(MPT)是解决这个问题的核心数据结构。


一、为什么需要 MPT

以太坊状态面临三个约束:

  1. 完整性验证:区块头中的状态根(state root)必须唯一确定整个状态
  2. 高效更新:每个区块可能修改大量账户,需要增量更新而非重新计算整棵树
  3. 轻客户端证明:节点必须能为任意 key-value 对生成简洁的Merkle 证明,让轻客户端在不下载完整状态的情况下验证特定值

简单的 Merkle 树满足条件 1 和 3,但不满足条件 2(插入/删除效率低)。

简单的 Patricia Trie 满足条件 2,但不满足条件 1 和 3。

MPT = Merkle + Patricia,同时满足三个约束。


二、三种数据结构的演化

2.1 Merkle Tree

          Root Hash
         /          \
    H(A+B)          H(C+D)
    /    \          /    \
  H(A)  H(B)     H(C)  H(D)
   |     |        |     |
  "a"   "b"      "c"   "d"

2.2 Patricia Trie(压缩前缀树)

键集合:["abc", "abd", "xyz"]
        root
       /    \
     ab       xyz
    /  \       |
   c    d    (值)
   |    |
  (值) (值)