以太坊作为全球第二大区块链平台,不仅仅是一种加密货币,更是一个去中心化的应用平台,其复杂而精巧的架构支撑着无数智能合约的去中心化执行,而理解以太坊如何记录交易、更新状态,是把握其核心运作机制的关键。“收据”(Receipt)与“状态”(State)是两个紧密相连、至关重要的概念,它们共同构成了以太坊网络运行的基石。

以太坊的“状态”:动态变化的全球账本

在以太坊中,“状态”(State)指的是在特定时间点,整个以太坊网络中所有账户的实时数据集合,你可以将其想象成一个动态的、不断更新的全球共享账本,这个账本记录了两种类型的账户:

  1. 外部账户(EOA, Externally Owned Account):由用户通过私钥控制的账户,例如我们日常使用的钱包地址,状态中记录了每个EOA的余额(Ether数量)。
  2. 合约账户(Contract Account):由智能代码控制的账户,状态中记录了合约的代码(Code)以及存储(Storage),即合约内部维护的变量数据。

以太坊的状态是一个默克尔帕特里夏树(Merkle Patricia Trie)数据结构,这种结构确保了状态的完整性、高效查询和快速验证,每一次有效的交易都会导致以太坊状态发生改变。

  • 当你从A地址向B地址发送1个ETH时,A地址的余额减少1个ETH,B地址的余额增加1个ETH,状态树相应更新。
  • 当你调用一个智能合约函数时,可能会改变合约账户的存储数据,同样会触发状态树的更新。

以太坊的状态是动态的、不断演进的,它反映了网络中所有账户和合约的最新情况,每个新的区块被确认后,都会产生一个新的状态根(State Root),该根是整个状态树的哈希值,作为状态完整性的“指纹”存储在区块头中。

以太坊的“收据”:交易的“回执”与状态变迁的证明

当我们发送一笔交易到以太坊网络后,我们如何知道交易是否被执行了?执行结果如何?这就是“收据”(Receipt)的作用。

收据是交易执行后生成的记录,可以看作是交易的“回执”或“收据”。 它并不直接包含交易的全部数据,而是包含了关于交易执行的关键信息,每笔成功执行(或执行失败,但被网络记录)的交易都会生成一个唯一的收据。

收据主要包含以下核心信息:

  1. 交易哈希(Transaction Hash):唯一标识这笔交易的哈希值。
  2. 区块哈希(Block Hash):该交易被包含在哪个区块中。
  3. 区块号(Block Number):区块的高度。
  4. 交易发起方(From):交易的发送地址。
  5. 交易接收方(To):如果是普通转账,这里是接收地址;如果是合约创建,这里为空。
  6. 状态码(Status):一个关键字段,通常为1(成功)或0(失败),指示交易是否成功执行。
  7. 累计 Gas 使用(Cumulative Gas Used):该区块中到此交易为止所消耗的总Gas量。
  8. Gas 使用(Gas Used):该交易自身消耗的Gas量。
  9. 日志 Bloom 过滤器(Logs Bloom):用于快速索引日志的数据结构。
  10. 日志(Logs):这是收据中非常重要的一部分,智能合约在执行过程中可以“发出”(emit)日志事件,这些日志记录了交易执行过程中的特定信息或结果,日志包含了地址(日志来源的主题)、主题(事件签名的哈希)以及数据(具体的日志内容),日志对于追踪合约交互、构建去中心化应用(DApps)的前端通知以及数据分析至关重要。

收据与状态的关系:随机配图