-
在以太坊乃至许多其他区块链的设计中,Merkle树(默克尔树)扮演着至关重要的角色,它确保了数据的完整性、高效性和可验证性,交易树(Transaction Tree)和收据树(Receipt Tree)是以太坊状态数据结构中的两大核心组成部分,它们共同构成了以太坊区块链数据组织和验证的基石,理解这两棵树的工作原理及其相互关系,对于深入把握以太坊的运作机制至关重要。

交易树(Transaction Tree):交易的忠实记录者
交易树是以太坊区块中所有交易数据的Merkle树,它的主要职责是记录并验证一个区块内包含的所有交易信息。
-
数据来源与构成: 每当一个矿工(或验证者)打包一个区块时,该区块中包含的所有交易(从coinbase交易到用户发起的转账、合约交互等)都会被序列化,并作为叶子节点(leaf nodes)构建成一棵Merkle树,每笔交易都包含了发送者、接收者、金额、数据、Gas限制、Gas价格、签名等关键信息。
-
核心作用:

- 完整性验证:通过Merkle树根(Merkle Root)的哈希特性,任何一笔交易的修改都会导致Merkle根哈希值的改变,这使得网络中的任何节点都可以快速验证一个区块中是否包含了特定交易,或者交易是否被篡改。
- 高效查询:Merkle树结构使得验证单个交易的存在性无需下载整个区块的所有交易数据,只需提供该交易及其相关的Merkle路径即可,大大提高了数据验证的效率。
- 区块链接:区块头中包含了交易树的根哈希值,这使得每个区块都通过这个唯一的“指纹”与前一区块链接起来,保证了整个区块链的连续性和不可篡改性。
简而言之,交易树是对“区块内发生了哪些交易”这一问题的权威、高效且可验证的答案。
收据树(Receipt Tree):交易结果的见证者
如果说交易树记录了交易的“过程”,那么收据树则记录了每笔交易执行后的“结果”,收据(Receipt)是交易执行后生成的一小块数据,它本身并不包含交易的全部原始信息,而是包含了交易执行的关键状态信息。
-
数据来源与构成: 每当一笔交易在以太坊网络上被执行后,EVM(以太坊虚拟机)会生成一个对应的收据,收据主要包含以下信息:

- 状态(Status):交易执行是否成功(1表示成功,0表示失败)。
- 累计Gas使用(Cumulative Gas Used):该交易及其前面所有交易在区块中消耗的Gas总量。
- 日志 Bloom过滤器(Logs Bloom):用于快速定位交易产生的日志主题(Topics)。
- 日志(Logs):交易执行过程中,智能合约触发的日志事件,包含地址、主题列表和数据。
-
核心作用:
- 交易状态证明:收据树为每笔交易的结果提供了不可篡改的证明,通过查询收据,任何人都可以知道一笔交易是否成功执行,以及执行的结果(合约调用是否返回了预期值,是否触发了特定事件)。
- 日志索引与检索:智能合约的日志是以太坊事件驱动和外部应用(如DApp前端、数据分析工具)获取链上信息的重要途径,收据树及其中的日志Bloom过滤器,使得高效检索特定合约的特定事件成为可能。
- 轻客户端支持:轻客户端可以通过下载区块头和关键收据信息,验证交易的状态,而无需下载整个区块和所有状态数据,从而节省了存储和带宽。
收据树将所有交易的收据组织成Merkle树,其根哈希同样被记录在区块头中,确保了交易结果的完整性和可验证性。
交易树与收据树的协同:构建完整的区块数据视图
在一个以太坊区块中,交易树和收据树是并行构建但又紧密关联的:
- 一一对应关系:区块中的第一笔交易对应收据树中的第一个收据,第二笔交易对应第二个收据,依此类推,这种顺序对应关系保证了交易与其执行结果之间的明确链接。
- 共同的区块头锚定:区块头中同时包含了交易树的根哈希和收据树的根哈希,这两个根哈希共同构成了该区块数据完整性的“双重保险”。
- 状态转换的基础:交易树驱动了以太坊状态从一个区块到下一个区块的转换,每笔交易执行后,都会修改状态(如账户余额、合约存储等),而收据则记录了这些转换过程中的关键结果和事件。
重要性总结
交易树和收据树是以太坊区块链数据结构的两大支柱:
- 交易树确保了交易数据的完整性和可追溯性,让用户能够确认自己的交易是否被网络包含,并且内容未被篡改。
- 收据树确保了交易执行结果的透明性和可验证性,让用户能够确认自己的交易是否成功执行,以及智能合约的行为是否符合预期。
-