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

首先需要明确的是,默克尔 Patricia 树(MPT)并非特指某一种树,而是一种结合了默克尔树(Merkle Tree)和Patricia Trie(前缀树)优点的数据结构,它是以太坊中几乎所有“树”的底层实现。
- Patricia Trie(前缀树):一种 Trie(字典树)的变体,它通过路径压缩的方式,减少了树的深度和节点数量,使得查找、插入和删除操作更加高效,尤其适合存储稀疏数据(即键分布不均匀的数据),在以太坊中,键通常是数据的哈希值或编码后的路径。
- 默克尔树(Merkle Tree):一种哈希树,其中每个叶子节点是数据块的哈希值,而非叶子节点是其子节点哈希值的哈希值,这种结构能够高效地验证数据是否完整和一致,因为只需要提供从目标节点到根节点的路径(称为“默克尔证明”)即可证明某个数据是否存在或未被篡改。
MPT 的优势在于:
- 高效性:Patricia Trie 的路径压缩特性使得存储和查询效率很高。
- 可验证性:默克尔树的结构使得任何数据的修改都能反映到根哈希的变化,并且可以提供简洁的证明。
- 去中心化:每个节点(账户、合约代码、存储等)都可以独立验证,无需信任中央机构。
在以太坊中,状态树、交易树、收据树等都是基于 MPT 构建的。
状态树(State Tree):记录全球账户状态的“总账”

状态树是以太坊中最重要的树之一,它存储了以太坊网络中所有账户(Account)的当前状态。
- 账户类型:以太坊有两类账户:外部账户(EOA,由用户控制,拥有私钥)和合约账户(由代码控制)。
- 账户状态数据:每个账户的状态包括:
- nonce:账户发起的交易数量或创建的合约数量。
- balance:账户的以太币余额。
- root:该账户的存储树的根哈希(仅合约账户有)。
- codeHash:账户合约代码的哈希(仅合约账户有)。
- 结构:状态树是一个 MPT,其键是账户地址(经过 RLPC 编码),值是对应账户状态的 RLP 编码,整个状态树的根哈希被包含在每个区块的头部,作为区块状态的一个摘要。
状态树的作用:
- 维护全局状态:它是以太坊“世界状态”(World State)的集中体现,记录了网络中所有账户的实时状态。
- 状态同步与验证:新节点可以通过同步状态树来加入网络,并通过验证状态根哈希来确保状态的完整性,当状态发生变化时(例如转账、合约执行),状态树会相应更新,并产生新的状态根哈希。
交易树(Transaction Tree):记录区块内交易的“流水账”
交易树用于存储特定区块内包含的所有交易(Transaction)的详细信息。

- 交易数据:每笔交易包含发送方地址、接收方地址(如果不是合约创建交易)、交易金额、gas 限制、gas 价格、数据字段以及 nonce 等信息。
- 结构:交易树同样是一个 MPT,其键是交易在区块中的索引(0, 1, 2...),值是对应交易的 RLP 编码,每个区块都有一棵独立的交易树,其根哈希也存储在该区块的头部。
交易树的作用:
- 交易存储与追溯:提供了区块内所有交易的有序、不可篡改的记录,方便用户和开发者查询历史交易。
- 轻客户端验证:轻节点可以通过下载区块头和默克尔证明来验证某笔交易是否确实被包含在某个区块中,而无需下载整个区块的所有交易数据。
- 交易顺序保障:由于交易树是 MPT,交易在树中的顺序(通过索引体现)得到了保障,这对于确定交易的执行顺序至关重要。
三种树的关系与以太坊的运行
这三种树并非孤立存在,而是紧密协作,共同支撑着以太坊的运行:
- 区块的构建:当矿工或验证者打包一个区块时,他们会收集一批待处理的交易。
- 交易树的生成:这批交易被组织成一棵交易树(Transaction Tree),并计算出交易树的根哈希(TxRoot)。
- 交易的执行与状态树的更新:以太坊虚拟机(EVM)会按照交易树中定义的顺序逐笔执行这些交易,每笔交易都会可能修改以太坊的全局状态(转账会改变账户余额,合约执行会改变合约账户的存储或状态)。
- 状态树的最终化:所有交易执行完毕后,会得到一个新的全球状态,这个新状态被组织成一棵新的状态树(State Tree),并计算出新的状态根哈希(StateRoot)。
- 区块头的完成:这个新区块的头部会包含:
- 前一个区块的哈希(ParentHash)
- 新状态树的根哈希(StateRoot)
- 新交易树的根哈希(TxRoot)
- (还有收据树的根哈希 ReceiptRoot,记录了交易执行的结果)
- 以及其他元数据(如时间戳、难度值等)。
通过这种方式,每个区块都通过其头部的“三根树根”(状态根、交易根、收据根)简洁地总结了该区块所包含的交易信息以及对以太坊全局状态造成的影响,这使得任何用户或节点都可以通过验证这些根哈希来快速确认区块的有效性和状态的正确性,而无需重复执行所有交易或存储全部数据。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。




