🐒
EthereumのTransaction Receiptについて
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
}
参考
Discussion