在以太坊的底层技术架构中,“树”(Tree)结构扮演着至关重要的角色,它们以高效、安全的方式组织和管理链上数据,确保了网络的去中心化、可验证性和一致性,以太坊中最核心的三种树分别是状态树(State Tree)、交易树(Transactions Tree)和收据树(Receipts Tree),它们共同构成了每个区块的“数据骨架”,本文将通过概念解析与图片化的形式,带你直观理解这三种树的结构与作用。
状态树(State Tree):以太坊的“世界状态账本”
核心概念
状态树是以太坊中最庞大、最核心的树结构,它记录了整个网络在某一时刻的“世界状态”(World State)——即所有账户(外部账户合约账户)的实时数据,包括账户余额、nonce、代码存储等,状态树就是以太坊的“总账本”,每一笔交易都会通过改变账户状态来更新这棵树。
状态树采用Merkle Patricia树(MPT)实现,这是一种结合了Merkle树(确保数据完整性)和Patricia Trie(高效前缀压缩)的数据结构,其优势在于:
- 高效查询:通过账户地址的前缀快速定位到具体账户数据;
- 轻量验证:只需验证少量节点即可确认账户状态是否被篡改;
- 动态更新:支持频繁的增删改操作,且不影响整体结构稳定性。
结构与图片解析
想象一棵从上至下生长的树,最顶层是根节点(Root Hash),每个区块头都会记录这个根节点的哈希值(称为“状态根”),根节点下通过分支节点(Branch Node)连接,最终通过扩展节点(Extension Node)和值节点(Value Node)定位到具体账户数据。
图片示意(文字描述可视化场景):
[状态树根节点]
/ | \ \
[分支节点] [分支节点] [分支节点] ...
/ \ / \ / \
[扩展节点] [值节点] [扩展节点] [值节点] ...
| | | |
[账户地址前缀] [账户A数据] [账户地址前缀] [账户B数据] ...
账户A的数据可能包含:{balance: 100 ETH, nonce: 1, code: "0x..."},当账户A收到一笔转账后,其对应的“值节点”数据会更新,整个状态树的根哈希也会随之改变,新区块会记录这个新的根哈希,确保状态可追溯。
交易树(Transactions Tree):每笔交易的“历史档案”
核心概念
交易树存储了某个区块内包含的所有交易数据,包括发送方地址、接收方地址、转账金额、手续费(gas fee)、交易数据(calldata)等,与状态树不同,交易树记录的是“过程数据”——即区块内发生的所有交易行为,而非最终结果。
同样采用Merkle Patricia树结构,其根哈希(称为“交易根”)会被记录在区块头中,交易树的主要作用是:
- 交易可追溯性:任何人可以通过交易根哈希验证区块内交易列表的完整性;
- 轻客户端支持:轻节点只需下载交易根哈希,即可通过零知识证明等方式验证交易是否存在,无需同步全部交易数据。
结构与图片解析
交易树的“叶子节点”直接存储每笔交易的完整数据,通过分支节点组织成树状结构,由于区块内的交易数量是固定的(由区块 gas 限制决定),交易树的结构相对规整。
图片示意(文字描述可视化场景):
