以太坊事件日志 (Event Log )分析获取以太坊多个交易详情- Tokenview
如果你对以太坊合约有研究,就会知道在调用合约的过程中会产生event log (事件日志)。当然如果你还不知道什么是智能合约可以参见什么是智能合约?这个事件日志会记录在交易的receipt函数中。通过对事件日志的分析可以获得多个以太坊交易的详细内容。
如何获取某个以太坊交易的事件日志?
Tokenview API数据服务可为用户提供ETH交易的日志详情。具体操作如下:
- 通过公链简称和交易索引,获得该交易的日志详情。http://www.tokenview.io:8088/{公链简称小写}/tx/runlog/{交易所在区块号}/{交易在区块里的位置}。例如:http://www.tokenview.io:8088/eth/tx/runlog/9000000/2
- 获得事件日志如下:
{
'code': 1,
'msg': '成功',
'data': {
'block_no': 9000000,
'index': '2',
'receipt': {
'status': '0x1',
'cumulativeGasUsed': '0x13325',
'logsBloom': '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000008000000000000000000000000008000000000000000000200000000000000000400000000000000000000000000000000000000000002000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000820000000002000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000',
'gasUsed': '0x8f15',
'logs': [
{ 'type': 'mined',
'topics': [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x2e1809d345216aa72833ba5f2881885c2999c103',
'0x5f5b019fd4b42cf0c92e3ec1bf85f2c562105578',
] 'address': '0xe5caef4af8780e59df925470b050fb23c43ca68c',
'transactionLogIndex': '0x0',
'logIndex': '0x0',
'data': '0x08bb2c9700'
}
]
},
'trace': [
{
'traceAddress': [],
'subtraces': 0,
'type': 'call',
'action': {
'callType': 'call',
'from': '0x2e1809d345216aa72833ba5f2881885c2999c103',
'gas': '0x6f95',
'value': '0x0',
'to': '0xe5caef4af8780e59df925470b050fb23c43ca68c',
'input': '0xa9059cbb0000000000000000000000005f5b019fd4b42cf0c92e3ec1bf85f2c56210557800000000000000000000000000000000000000000000000000000008bb2c9700'
},
'result': {
'output': '0x01',
'gasUsed': '0x6f95'
}
}
]
}
}
{
'code': 1,
'msg': '成功',
'data': {
'block_no': 9000000, // 区块高度
'index': '2', // 交易在区块里的位置索引
'receipt': {//这个是geth全节点的Event日志
'status': '0x1', //16进制
'cumulativeGasUsed': '0x13325',
'logsBloom': '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000008000000000000000000000000008000000000000000000200000000000000000400000000000000000000000000000000000000000002000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000820000000002000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000',
'gasUsed': '0x8f15', //gas使用量
'logs': [
{
'type': 'mined', //type 一般都是mined,表示该日志由矿工生成
'topics': [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', //keccak(Transfer(address,address,uint256)),对事件的字符做keccak散列运算
'0x2e1809d345216aa72833ba5f2881885c2999c103', //address类型from参数补齐64位
'0x5f5b019fd4b42cf0c92e3ec1bf85f2c562105578' //address类型to参数补齐64位
],
'address': '0xe5caef4af8780e59df925470b050fb23c43ca68c', //被调用的合约地址
'transactionLogIndex': '0x0',
'logIndex': '0x0',
'data': '0x08bb2c9700' //合约的返回值
}
]
},
'trace': [ // 这个是parity全节点的trace日志
{
'traceAddress': [],
'subtraces': 0,
'type': 'call',
'action': {
'callType': 'call',
'from': '0x2e1809d345216aa72833ba5f2881885c2999c103',
'gas': '0x6f95',
'value': '0x0',
'to': '0xe5caef4af8780e59df925470b050fb23c43ca68c',
'input': '0xa9059cbb0000000000000000000000005f5b019fd4b42cf0c92e3ec1bf85f2c56210557800000000000000000000000000000000000000000000000000000008bb2c9700'
},
'result': {
'output': '0x01',
'gasUsed': '0x6f95'
}
}
]
}
}
具体日志分析
首先我们需要了解以太坊交易中的基本规则。例如:代币的购买,会触发代币的Transfer事件,这是ERC20标准的基本规定。
对事件的基本定义: event Transfer(address indexed from, address indexed to, uint256 value);
- 事件名字:Transfer
- 事件的参数:address, address, uint256,且此事件的from和to参数前有indexed标记,value没有indexed标记
- 事件的规则是:
topic[0]: keccak(Transfer(address,address,uint256)),对事件的字符做keccak散列运算
topic[1]: address类型from参数补齐64位
topic[1]: address类型to参数补齐64位
data: 没有indexed标记的value的值转化为16进制,并补齐64位
具体实现如下:
从from这个账户发送 value个token(代币) 到to这个账户
Transfer(address indexed from, address indexed to, uint256 value)事件名字散列值
topic[0] = keccak(Transfer(address,address,uint256)) = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef后续的就是参数中有indexed标志的参数 所传递的值fromeAddress 补齐64位
topic[1] = 0x2e1809d345216aa72833ba5f2881885c2999c103topic[2] = 0x5f5b019fd4b42cf0c92e3ec1bf85f2c562105578然后是另一个不带indexed标志的参数的 值传入这就是一个数字转化为16进制 然后补齐64位
data = 00000000000000000000000000000000000000000000000000000008bb2c9700
也可以通过Tokenview全币种区块链浏览器直接查看这笔交易。请点击此处查看详细交易信息和事件日志。
具体事件分析
基本交易信息:
- 交易hash: https://eth.tokenview.io/cn/tx/9000000/2>
- 合约1的code : https://eth.tokenview.io/cn/address/0x2e1809d345216aa72833ba5f2881885c2999c103>
- 合约2的code: https://eth.tokenview.io/cn/address/0x5f5b019fd4b42cf0c92e3ec1bf85f2c562105578>
交易描述
普通用户地址向合约地址转了37500个FRM,所触发的事件分析。