在以太坊这样复杂的区块链系统中,数据的组织和高效检索至关重要,为了实现这一点,以太坊采用了三种核心的树状数据结构,它们共同构成了区块链状态、交易历史和账户信息高效存储与验证的基础,这三种树分别是:默克尔帕特里夏树(Merkle Patricia Tree, MPT)、状态树(State Tree) 和 交易树(Transaction Tree),虽然它们紧密协作,但各自扮演着独特的角色。
默克尔帕特里夏树(Merkle Patricia Tree, MPT)—— 高效数据组织的核心
首先需要明确的是,默克尔帕特里夏树(MPT)并不是一种独立的树,而是一种树的数据结构类型,以太坊中的状态树和交易树(以及收据树)都是基于MPT实现的,MPT结合了默克尔树(Merkle Tree)和帕特里夏树(Patricia Trie)的优点:
- 帕特里夏树(Patricia Trie):一种前缀树(Radix Tree)的变体,能够高效地存储和检索键值对,并且共享公共前缀,从而节省空间,它允许在O(k)的复杂度内进行查找(k是键的长度),对于以太坊中长长的账户地址或交易哈希非常高效。
- 默克尔树(Merkle Tree):一种哈希树,通过将数据块进行哈希运算,并将这些哈希值 recursively 组合起来,最终得到一个根哈希值,这种结构能够高效地验证数据是否被篡改,因为任何数据的微小改动都会导致根哈希值的巨大变化。
MPT的优势在于它既提供了帕特里夏树的高效空间利用和快速查找能力,又具备了默克尔树的数据完整性验证特性,在以太坊中,所有账户的状态、交易数据、收据等都是通过MPT来组织的。
状态树(State Tree)—— 以太坊世界的“账本”
状态树是以太坊中最重要的MPT之一,它记录了以太坊世界状态(World State)的全部信息,世界状态可以理解为以太坊区块链上所有账户的实时快照。
- 结构:状态树的每个叶子节点代表一个以太坊账户,账户的键是账户地址(经过哈希处理),值是该账户的状态信息,包括:
- nonce(账户发起的交易数量)
- balance(账户余额)
- storageRoot(该账户的存储树的根哈希,稍后详述)
- codeHash(账户合约代码的哈希)
- 作用:
- 存储账户信息:所有活跃账户的状态都存储在状态树中。
- 状态查询与验证:通过状态树的根哈希(即状态根),任何人都可以快速验证某个账户的状态是否正确,而不需要下载整个区块链数据。
- 状态转换:当一笔交易被执行时,它会修改一个或多个账户的状态,状态树会相应更新,并生成新的状态根。
状态树就是以太坊的“总账本”,记录了每个账户的当前状况。
交易树(Transaction Tree)—— 交易历史的“索引”
交易树是另一个基于MPT的重要数据结构,它记录了特定区块内的所有交易信息。
- 结构:交易树的每个叶子节点代表一笔交易,交易的键通常是交易在区块中的索引(或经过某种方式派生的键),值是该交易的详细信息,包括:
- 发送方地址
- 接收方地址(如果是转账)
- 交易金额
- Gas限制和价格
- 输入数据
- 签名等









