在以太坊区块链的复杂架构中,有三个核心的数据结构,它们都以“树”(Tree)的形式存在,共同构成了以太坊数据存储和检索的基石,它们分别是状态树(State Tree)、交易树(Transactions Tree) 和收据树(Receipts Tree),虽然它们都借鉴了Merkle Patricia Trie(MPT,Merkle Patricia前缀树)这一高效数据结构,但它们各自承载着截然不同的功能,对于理解以太坊的运作至关重要,本文将详细探讨这三棵树的区别。
状态树(State Tree):世界状态的“总账”
定义与作用: 状态树,有时也被称为“世界状态树”(World State Tree),是记录以太坊当前所有账户状态的“总账”,这里的“账户”包括外部账户(EOA,由用户私钥控制的账户)和合约账户,状态树存储了每个账户的关键信息,如 nonce(交易次数)、balance(余额)、storageRoot(合约存储树的根哈希,指向合约的存储数据)和codeHash(合约代码的哈希)。
状态树回答了这样一个问题:“在当前这一刻,以太坊上每一个账户的状态是怎样的?”
特点:
- 动态性: 状态树是动态变化的,每当有新的交易被确认并执行,改变了账户的状态(转账改变了余额,合约调用了合约函数),状态树就会相应地更新。
- 全局性: 它包含了整个以太坊网络中所有账户的状态信息,是整个“世界状态”的缩影。
- 根哈希标识: 状态树的根哈希值被包含在每个区块的头部(Block Header)中,这意味着,任何对世界状态的微小改动,都会导致区块头哈希的变化,从而保证了状态的不可篡改性,验证者可以通过比较状态树根哈希来快速验证状态的一致性。
交易树(Transactions Tree):交易历史的“索引”
定义与作用: 交易树,顾名思义,是存储某个区块内所有交易列表的Merkle Patricia Trie,它按顺序排列了该区块包含的所有交易数据(或交易数据的哈希值)。
交易树的作用是为区块内的交易提供一种高效的验证和检索机制,它回答了这样一个问题:“在这个特定的区块里,发生了哪些交易?这些交易是如何排列的?”
特点:
- 区块级关联: 每个区块都有自己独立的交易树,仅包含该区块内的交易。
- 顺序性: 交易树的构建依赖于交易在区块中的顺序,这保证了交易的确定性执行顺序。
- 根哈希标识: 交易树的根哈希同样被包含在区块头部,这使得任何人都可以通过计算交易树的根哈希来验证区块中交易列表的完整性和顺序性,而无需下载所有交易数据。
收据树(Receipts Tree):交易结果的“报告”
定义与作用: 收据树是存储某个区块内所有交易执行结果(即收据)的Merkle Patricia Trie,收据(Receipt)是交易执行后生成的“收据”或“回执”,它本身不是交易数据,而是交易执行的状态和结果的记录。
每个收据包含以下关键信息:
- status: 交易执行是否成功(1表示成功,0表示失败)。
- cumulativeGasUsed: 该区块中到此交易为止累计消耗的gas总量。
- logsBloom: 布loom过滤器,用于快速查询该交易产生的日志(Logs)。
- logs: 交易产生的日志列表,这是事件驱动应用(如DeFi、NFT)的重要数据来源。
收据树回答了这样一个问题:“这个交易执行后,结果如何?成功了还是失败了?消耗了多少gas?产生了哪些日志事件?”
特点:
- 区块级关联:
