以太坊事件日志 (Event Log )分析获取以太坊多个交易详情- Tokenview

如果你对以太坊合约有研究,就会知道在调用合约的过程中会产生event log (事件日志)。当然如果你还不知道什么是智能合约可以参见什么是智能合约?这个事件日志会记录在交易的receipt函数中。通过对事件日志的分析可以获得多个以太坊交易的详细内容。

如何获取某个以太坊交易的事件日志?

Tokenview API数据服务可为用户提供ETH交易的日志详情。具体操作如下:

  • 通过公链简称和交易索引,获得该交易的日志详情。http://www.tokenview.com:8088/{公链简称小写}/tx/runlog/{交易所在区块号}/{交易在区块里的位置}。例如:http://www.tokenview.com: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] = 0x2e1809d345216aa72833ba5f2881885c2999c103
topic[2] = 0x5f5b019fd4b42cf0c92e3ec1bf85f2c562105578

然后是另一个不带indexed标志的参数的 值传入
这就是一个数字转化为16进制 然后补齐64位

data = 00000000000000000000000000000000000000000000000000000008bb2c9700

也可以通过Tokenview全币种区块链浏览器直接查看这笔交易。请点击此处查看详细交易信息和事件日志。

ETH的事件日志分析

具体事件分析

基本交易信息:

  • 交易hash: https://eth.tokenview.com/cn/tx/9000000/2>
  • 合约1的code : https://eth.tokenview.com/cn/address/0x2e1809d345216aa72833ba5f2881885c2999c103>
  • 合约2的code: https://eth.tokenview.com/cn/address/0x5f5b019fd4b42cf0c92e3ec1bf85f2c562105578>

交易描述

普通用户地址向合约地址转了37500个FRM,所触发的事件分析。