以太坊的input和log数据结构(记录以备忘)

以bsc上的一个普通的erc20转账交易0x1d5c883610f306b4fddd345398a9c8f56966e94decfe2be96c5108261d0be3cd(Binance Transaction Hash (Txhash) Details | BscScan)为例

input:’0xa9059cbb0000000000000000000000005a65a600e631a7228815fe72788de98a14853ca6000000000000000000000000000000000000000000000d725a4d7fc5f5669945’

前面4字节(8个十六进制)用来匹配调用的方法(用截取哈希值来匹配),这里匹配出来的是erc20的transfer方法:transfer(address recipient, uint256 amount)

再往后32个字节(64个十六进制)是第一个入参的值,这里是recipient地址0x5a65a600e631a7228815fe72788de98a14853ca6

再往后32个字节(64个十六进制)是第二个入参,这里是amount,把十六进制转回十进制即可

log:{

topic0:‘0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef’,

topic1:’0xfd0eee7d3984207a8b509a33531b2674e18428bf’,

topic2:‘0x5a65a600e631a7228815fe72788de98a14853ca6’,

data:‘0x0000000000000000000000000000000000000000000004a9367788ad12364870‘

}

这里topic0是event方法的哈希,这里是 web3py.keccak(text='Transfer(address,address,uint256)').hex()

topic1,2,3分别是event里面的有indexed的入参,搜索得知transfer这个event的入参分别为address indexed from,address indexed to,正好对应着这里的topic1和topic2,即发送方和接收方的地址

data是event里面没有indexed的入参由先后顺序按照相应的类型所占的字节数分隔开就行了,这里就是uint256(也就是每个变量占64个十六进制的长度),转账金额

你可能感兴趣的:(以太坊的input和log数据结构(记录以备忘))