🐒

EthereumのTransaction Receiptについて

2024/04/28に公開

Transaction Receiptとは何か?

Transaction receiptは、transactionの結果です。
具体的な中身を解説する前にreceiptの中身の一つであるlogsについて書きます。

スマートコントラクトが保存する情報

スマートコントラクトは、Account storageとlogsを保存します。

Account storage

Account storageとは、皆さんがブロックチェーンに書き込むデータのことです。このデータは、スマートコントラクトの状態でコントラクトからアクセスできます。

logs

このデータは、オフチェーンのアプリケーション(フロントエンドなど)がアクセスするための情報です。皆さんがSolidityコードでEvent関数を作ってemitした結果を記録しています。ガス代はAccount storageよりも安いです。

Transaction Receiptの中身について

今回は「Status」、「Gas Used」、「Logs」、「Logs Bloom」について書いていきます。

receipt: {
  blockHash: '0xc87adc08d777cec748e9a40ce8ad43ca9104d8714283c02c490b351b314d9989',
  blockNumber: 6370291n,
  cumulativeGasUsed: 439029n,
  effectiveGasPrice: 4206412813n,
  from: '0x113c4064fdf3710ec38cc9b709852c56be1d1803',
  gasUsed: 439029n,
  logs: [
    {
      address: '0xcda2490f4b7f8f9e5df274fe2e065258f53f10bc',
      topics: [Array],
      data: '0x',
      blockNumber: 6370291n,
      transactionHash: '0x00eec155734d9f5541e4fc5028cdd8845bcf70a48c2456177708cbdd9bb198bc',
      transactionIndex: 0n,
      blockHash: '0xc87adc08d777cec748e9a40ce8ad43ca9104d8714283c02c490b351b314d9989',
      logIndex: 0n,
      removed: false
    },
    {
      address: '0xcda2490f4b7f8f9e5df274fe2e065258f53f10bc',
      topics: [Array],
      data: '0x000000000000000000000000113c4064fdf3710ec38cc9b709852c56be1d1803000000000000000000000000000000000000000000000000000000000000001d',
      blockNumber: 6370291n,
      transactionHash: '0x00eec155734d9f5541e4fc5028cdd8845bcf70a48c2456177708cbdd9bb198bc',
      transactionIndex: 0n,
      blockHash: '0xc87adc08d777cec748e9a40ce8ad43ca9104d8714283c02c490b351b314d9989',
      logIndex: 1n,
      removed: false
    },
    {
      address: '0xd16871d92768ab3e87dbc79c6714f2fb26c3618f',
      topics: [Array],
      data: '0x4ddd0c5fdc7aeec894bd61453fbcf3beedb802c261e245f34ea8b909f1888aeb000000000000000000000000e939506452cf9e4f623798130226481b799522e1',
      blockNumber: 6370291n,
      transactionHash: '0x00eec155734d9f5541e4fc5028cdd8845bcf70a48c2456177708cbdd9bb198bc',
      transactionIndex: 0n,
      blockHash: '0xc87adc08d777cec748e9a40ce8ad43ca9104d8714283c02c490b351b314d9989',
      logIndex: 2n,
      removed: false
    }
  ],
  logsBloom: '0x00000080000000000000000000000000000000000000000000000000000800000000000000000010000000000000020000008000400000000000000200000000100000000000000040000008100000800000000000010010000900000000000000000000060000000000000000000800000000000000000080008010000000000000000000000000000000040000000000000000000008000020000000000000200008000000000000000000000000000020000000000200000000000000004000000002020040100001000000100000000000000000000000100000000020000000000000000000000000010800004000000000000000000000000000100000',
  status: 1n,
  to: '0xcda2490f4b7f8f9e5df274fe2e065258f53f10bc',
  transactionHash: '0x00eec155734d9f5541e4fc5028cdd8845bcf70a48c2456177708cbdd9bb198bc',
  transactionIndex: 0n,
  type: 0n
}

Status

Transactionが成功したかどうかを0と1を使って表しています。

Gas Used

名前の通り、使ったガスの合計です。

Logs

Event結果のオブジェクトのリストです。

address

Eventを発火したコントラクトアドレスです。

topics

topicsには、スマートコントラクトに記述したEvent関数のハッシュ値が入っています。
例えば、以下のようにコードを書いた場合、
event mint(address sender, uint256 tokenId)
「mint(address,uint256)」をkeccak256でハッシュ化した値がtopicsに入るわけです。

data

abiにエンコードされたlogデータが入っています。
以下のコードはデコードした結果です。event関数の第一引数と第二引数の結果が入っていますね。

decodedLog: {
  '0': '0x113c4064Fdf3710Ec38CC9B709852c56be1d1803',
  '1': 29n,
  __length__: 2,
  sender: '0x113c4064Fdf3710Ec38CC9B709852c56be1d1803',
  tokenId: 29n
}

参考

https://medium.com/coinmonks/ethereum-data-transaction-receipt-trie-and-logs-simplified-30e3ae8dc3cf

Discussion