在区块链技术的宏大叙事中,以太坊作为全球第二大公有链和智能合约平台的代表,其底层架构的精巧与高效一直是开发者和技术爱好者津津乐道的话题,在以太坊复杂的 state tree(状态树)和 transaction tree(交易树)之外,还有一个同样至关重要的组件——收据树(Receipt Tree),它如同一位默默无闻的“账本管家”,记录着每一笔交易的执行结果,为以太坊的可追溯性、安全性和轻客户端验证提供了坚实的基础。

什么是收据?

要理解收据树,首先需要明白什么是“收据”(Receipt),在以太坊中,当一笔交易被网络打包进一个区块并成功执行后,会产生一个收据,这个收据并非交易本身,而是交易执行结果的一个结构化摘要,它包含了以下关键信息:

  1. 状态码(Status):指示交易执行是否成功(1 表示成功,0 表示失败)。
  2. 累计消耗 Gas(Cumulative Gas Used):从当前区块开始到该交易结束为止,总共消耗的 Gas 量。
  3. 日志 Bloom 过滤器(Logs Bloom Filter):一个高效的布隆过滤器,用于快速判断某个地址或主题是否出现在该交易的日志中。
  4. 日志(Logs):这是收据中最重要的部分之一,智能合约在执行过程中可以触发日志事件,日志包含地址、主题列表(Topics)和事件数据(Data),日志是智能合约与外部世界交互、传递信息的重要方式,也是事件监听和索引服务的数据来源。

收据回答了“这笔交易成功了吗?”“花了多少 Gas?”“智能合约产生了哪些事件?”这些关键问题。

收据树的诞生:从中心化到结构化存储

在以太坊的早期版本(如 Frontier, Homestead),区块结构相对简单,交易执行后的收据信息是直接存储在区块体中的,并没有采用树形结构,随着以太坊的发展,交易数量和复杂度急剧增加,这种简单的存储方式逐渐暴露出一些问题,例如数据检索效率低下、难以支持高效的轻客户端验证等。

为了解决这些问题,以太坊在拜占庭硬分叉(Byzantium Hard Fork,2017年11月)中正式引入了收据树(Receipt Tree)随机配图