以太坊作为全球领先的智能合约平台,其强大的功能和安全性很大程度上归功于其独特的数据存储机制,在以太坊的区块中,三棵关键的数据树——状态树(State Tree)、交易树(Transactions Tree)和收据树(Receipts Tree)——共同构成了一个高效、安全且可验证的账本体系,这三棵树不仅是以太坊数据存储的核心,也是其实现状态同步、交易验证和轻客户端支持的基础,本文将深入探讨这三棵树的结构、功能及其在以太坊生态系统中的重要作用。
状态树(State Tree)—— 以太坊世界的“快照”
状态树是以太坊中最为核心的一棵树,它记录了以太坊网络在特定时间点的全局状态,这个“全局状态”可以理解为以太坊世界计算机的内存,包含了所有账户信息、合约代码、存储变量等。
- 结构:状态树是一个Merkle Patricia Trie(MPT,默克尔帕特里夏树),MPT结合了Merkle树(确保数据完整性和高效验证)和Patricia Trie(一种前缀树,优化了存储和查询效率,尤其适合稀疏数据)的优点。
- 树的每个叶子节点代表一个账户,每个账户在以太坊中由地址唯一标识,其内容包括:
- nonce:账户发起的交易数量或创建的合约数量。
- balance:账户的以太币余额。
- root:该账户对应的存储树的根哈希(如果账户是合约账户)。
- codeHash:账户合约代码的哈希(如果账户是合约账户)。 对于合约账户,其存储的数据(状态变量)则存储在一棵独立的存储树(Storage Tree)中,这也是一棵MPT,其根哈希会作为状态树中对应账户的一个字段。
- 作用:
- 状态表示:完整地记录了以太坊在某个区块被创建后的所有账户状态。
- 状态验证:由于Merkle树的性质,任何对状态的微小改动都会导致根哈希的显著变化,这使得节点可以高效地验证某个特定账户的状态是否属于某个全局状态。
- 数据同步:新节点可以通过同步最新的状态树快速加入网络,而不需要从创世区块开始重放所有历史交易。
交易树(Transactions Tree)—— 区块内交易的“证明书”
交易树记录了当前区块包含的所有交易信息。
- 结构:同样是一棵Merkle Patricia Trie (MPT)。
- 树的每个叶子节点代表一笔交易,交易数据包括发送方、接收方(或合约地址)、交易金额、交易数据、gas限额、gas价格、nonce、签名等详细信息。
- 作用:
- 交易打包与顺序:确保区块中的交易按照特定顺序被组织和记录。
- 交易存在性证明:通过Merkle根哈希,可以高效证明某笔交易是否包含在特定的某个区块中,这对于轻客户端和交易所等需要验证交易但又不存储完整数据的场景至关重要。
- 交易溯源:提供了一种可追溯的交易历史记录方式。
收据树(Receipts Tree)—— 交易执行的“回执”
收据树记录了区块中每笔交易执行后的结果信息,它本身不包含原始交易数据,而是交易的“执行回执”。
- 结构:同样是一棵Merkle Patricia Trie (MPT)。
- 每笔交易对应一个收据,收据主要包含以下信息:
- status:交易执行状态(成功或失败)。
- cumulativeGasUsed:当前区块中到此交易为止已消耗的总gas量。
- logsBloom:布隆过滤器,用于快速判断某个地址的日志是否包含在此收据中(日志是事件的重要来源)。
- logs:交易产生的事件日志列表,包括日志地址、主题列表、数据等,这对于智能合约的事件监听和DApp交互非常重要。
- 作用:
- 交易结果查询:让用户和应用程序能够查询交易是否成功执行,以及执行过程中产生了哪些事件(logs)。
