以太坊事件日志 (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全币种区块链浏览器直接查看这笔交易查看详细交易信息和事件日志。

以太坊事件日志 (Event Log )分析获取以太坊多个交易详情- Tokenview_第1张图片

具体事件分析

基本交易信息:

  • 交易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,所触发的事件分析。

你可能感兴趣的:(区块链API)