[md]
日志中的topics和data字段,包含了我们感兴趣的数据。
topics的第一个成员,总是相应事件的签名。而其他的成员则有序对应着事件 参数中的有索引(indexed)参数:
因此我们首先根据第一个主题判断是否为感兴趣的事件,然后依次解码参数即可:
$mytopic = $ethabi->encodeEventSignature('Transfer(address,address,uint256)');
$web3->eth->getFilterChanges($fid,$cb);
$logs = $cb->result;
foreach($logs as $log){
if($log->topics[0] != $mytopic) continue;
echo 'event Transfer triggered ' . PHP_EOL;
$from = $ethabi->decodeParameter('address',$log->topics[1]);
echo 'from: ' . $from . PHP_EOL;
$to = $ethabi->decodeParameter('address',$log->topics[2]);
echo 'to: ' . $to . PHP_EOL;
$value = $ethabi->decodeParameter('uint256',$log->data);
echo 'value: ' . $value . PHP_EOL;
}
由于Transfer事件的value参数不是有索引参数,因此它的值在日志的data字段中。 如果存在多个无索引参数时,则data字段是这些参数按32字节顺序拼接的结果:
参考教程和示例代码,编写php脚本实现以下功能:监听代币合约的所有事件
打印输出Approve事件的参数
完结。