在以太坊这个复杂的区块链生态系统中,数据以高效、安全且可验证的方式存储是至关重要的,为了实现这一目标,以太坊巧妙地运用了三种不同类型的数据结构树,它们共同构成了以太坊状态和交易数据的核心骨架,这“三棵树”分别是:状态树(State Tree)、交易树(Transactions Tree)和收据树(Receipts Tree),理解它们的工作原理和相互关系,是深入掌握以太坊运作机制的关键。

下面,我们将逐一介绍这三种树:

状态树(State Tree) - 以太坊的“世界账本”

状态树,有时也被称为世界状态树(World State Tree),是以太坊数据结构的基石,它记录了以太坊网络在任何一个给定时间点的全局状态,可以理解为整个以太坊的“世界账本”或“快照”。

  • :状态树存储了所有账户的信息,以太坊账户分为两类:
    • 外部账户(EOA, Externally Owned Account):由用户私钥控制的账户,用于发送交易、持有资产等,其状态包括余额(Balance)、nonce(交易计数器)等。
    • 合约账户(Contract Account):由代码和存储组成的账户,其状态包括代码(Code)和合约存储(Storage)。
  • 数据结构:它是一个Merkle Patricia Trie(MPT,默克尔帕特里夏树),这种结合了Merkle Tree和Patricia Tree优化的数据结构,能够高效地存储、查找和更新数据,同时支持Merkle证明,极大地节省了存储空间并提高了数据验证效率。
  • 核心作用
    • 存储当前状态:任何账户余额的变化、合约代码的部署或执行,都会反映在状态树上。
    • 状态查询与验证:节点可以通过查询状态树来获取任意账户的当前状态,轻量级节点(如轻客户端)可以通过Merkle证明来验证特定状态的真实性,而无需下载整个状态树。
    • 状态根(State Root):状态树的顶部哈希值(根哈希)被包含在每个区块的头部中,这个状态根是该区块创建时刻整个以太坊世界状态的唯一、紧凑的表示,如果状态有任何变动,状态根就会改变,这确保了状态的不可篡改性。

交易树(Transactions Tree) - 区块内的“交易流水账”

如果说状态树是全局的“账本”,那么交易树则是记录单个区块内所有交易详情的“流水账”。

  • :它存储了特定区块内包含的所有交易(Transaction)的列表,每笔交易都包含发送者、接收者(或合约地址)、价值、数据、gas限制、gas价格、签名等详细信息。
  • 数据结构:同样采用Merkle Patricia Trie (MPT) 结构,区块中的所有交易按照一定顺序排列,并依次插入到这棵树中。
  • 核心作用
    • 交易历史记录:提供了区块内所有交易的完整、可验证的记录。
    • 交易根(Transactions Root):交易树的根哈希值也被写入区块头,这使得任何人都可以验证一个区块是否包含了特定的一组交易,并且这些交易没有被篡改,通过计算区块内所有交易的Merkle根,并与区块头中记录的交易根进行比对,即可验证交易的完整性。

收据树(Receipts Tree) - 交易的“执行回执”

收据树是相对较晚引入以太坊(在拜占庭硬分叉中)但极为重要的一个数据结构,它存储的是每笔交易执行后的“回执”或“收据”,而非交易本身。

  • :每笔交易执行后,都会生成一个收据,包含以下关键信息:
    • 状态(Status):指示交易是否成功执行(1表示成功,0表示失败)。
    • 累计消耗Gas(Cumulative Gas Used):从区块开始到该交易执行完毕所消耗的总Gas量。
    • 日志条目(Logs):这是收据中最核心的部分,由合约在执行过程中通过LOG0随机配图