在区块链技术领域,以太坊以其智能合约功能和图灵完备性而闻名,支撑起这个庞大去中心化应用的,并非仅仅是代码和共识机制,更有一套精妙的数据结构设计。三种核心的树状数据结构——状态树(State Tree)、交易树(Transactions Tree)和收据树(Receipts Tree)——共同构成了以太坊数据存储和检索的基石,它们共同维护了整个网络的状态,并确保了数据的完整性、可验证性和高效访问。

理解这“三棵树”,就是理解以太坊如何高效、安全地记录每一笔交易和每一个账户状态的关键。

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

状态树是这三种树中最为核心的一棵,它记录了以太坊在任何一个特定区块被确认后,整个网络的全局状态,你可以把它想象成以太坊的“世界账本”或“总账”。

  • :它存储了所有账户的状态信息,这包括两类账户:
    • 外部账户(EOA):由用户私钥控制的账户,记录其余额、nonce值等。
    • 合约账户:由代码控制的账户,记录其代码、存储数据、余额等。
  • 数据结构:它是一棵Merkle Patricia Trie(MPT,默克尔帕特里夏树),这是一种结合了Merkle树和Patricia Trie优化的数据结构。
    • Merkle树的特性确保了任何数据的微小改动都会导致根哈希值的巨大变化,这使得我们可以高效地验证某个特定数据是否存在于树中,而不需要下载整棵树。
    • Patricia Trie是一种更节省空间的压缩前缀树,特别适合存储键值对,并且能高效地进行查询和更新。
  • 核心作用
    1. 存储全局状态:它是以太坊当前所有账户状态的权威记录。
    2. 状态验证:轻量级节点(如手机钱包)只需下载状态树的根哈希,即可向全节点验证某个账户的余额或状态是否真实有效,无需同步全部数据。
    3. 驱动交易执行:每当一笔交易被执行时,它会读取和修改状态树中的数据,转账会修改发送方和接收方的余额。

状态树回答了“在当前这个时刻,以太坊上每个账户都是什么样子的?”这个问题。

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

如果说状态树是静态的“世界账本”,那么交易树则是记录某个特定区块内所有交易活动的“流水账”。

  • :它存储了包含在某个区块中的所有交易数据,每笔交易作为一个叶子节点被存储在树中。
  • 数据结构:同样是一棵Merkle Patricia Trie (MPT)
  • 核心作用
    1. 记录交易历史:它为每个区块内的所有交易提供了一个不可篡改的、有序的记录。
    2. 交易验证:任何人都可以通过计算交易树的根哈希,并将其与区块头中记录的值进行比对,来快速验证一笔交易是否确实被包含在该区块中,这对于轻节点验证交易历史至关重要。
    3. 数据完整性:与状态树一样,其Merkle结构保证了任何一笔交易的增删改都会导致根哈希的改变,从而保证了区块内交易数据的完整性。

交易树回答了“在区块N里,到底发生了哪些交易?”这个问题。

收据树(Receipts Tree)—— 交易的“回执证明”

收据树是相对抽象但非常重要的一棵树,它不直接存储交易数据,而是存储每笔交易执行后产生的“回执”或“收据”,这个收据是交易执行结果的证明。

  • :每笔交易执行后,都会生成一个收据,并作为叶子节点存入收据树,收据中包含:
    • 状态:交易是成功还是失败。
    • gas 使用情况:交易消耗了多少 gas。
    • 日志条目(Logs):这是智能合约与外部世界进行交互的关键,合约在执行过程中可以生成日志,用于记录事件、通知外部应用或触发其他操作。
    • 合约地址:如果交易是创建新合约,收据中会包含新合约的地址。
  • 数据结构随机配图