2019独角兽企业重金招聘Python工程师标准>>>

参考文档。

例子代码如下:

pragma solidity ^0.4.25;contract Assert{}
contract TestReturn {Assert ast;event CreateAssertAll(Assert indexed _sig,uint256 indexed  id);event CreateAssertOne(Assert indexed _sig,uint256  id);event Create(Assert _sig,uint256 id);function check() public returns(uint256) {ast = new Assert();emit CreateAssertAll(ast,uint256(6));emit CreateAssertOne(ast,uint256(6));emit Create(ast,uint256(6));}}

上面的代码中,有3个event。他们的index不同。生成的log数据结构不一样。

  • CreateAssertAll全部是index。
  • CreateAssertOne有一个是idnex。
  • Create全部都不是index。
    我在ropsten上调用了这个方法。hash如下:
    https://ropsten.etherscan.io/tx/0x12e3384bdba97c631bbaa5df27e94e6baeb9ee894ee80c7d9ce0e1b9944b70d7
    可以查看生成的event:
    https://ropsten.etherscan.io/address/0x92e22427412dc8705b69c2db1b702d51586018f5#events

使用web3查看日志。

const Web3 = require('web3');
const web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/XXX"));const SolidityCoder = require("web3/lib/solidity/coder.js");
web3.eth.getTransactionReceipt("0x12e3384bdba97c631bbaa5df27e94e6baeb9ee894ee80c7d9ce0e1b9944b70d7",function(error, result){if(!error){// console.log("receipt ==== ",result);let logs = result.logs;console.log("logs ==== ",logs);let data = SolidityCoder.decodeParams(["address", "uint256"], logs[2].data.replace("0x", ""));console.log("data ==== ",data);}elseconsole.error(error);
});

可以看到打印日下:

logs ====  [ { address: '0x92e22427412dc8705b69c2db1b702d51586018f5',blockHash: '0x06cf0bd459caa91c9fd13a7b65875d300942648a975bf282813c4e1596258192',blockNumber: 4381899,data: '0x',logIndex: 3,removed: false,topics: [ '0xd39437daf43d90c2fc7f92c178818776f8ae6c1e6bde3215fa60b27756797d17','0x00000000000000000000000029f65c9a6f016ad76f5a26896343d3731267cc36','0x0000000000000000000000000000000000000000000000000000000000000006' ],transactionHash: '0x12e3384bdba97c631bbaa5df27e94e6baeb9ee894ee80c7d9ce0e1b9944b70d7',transactionIndex: 20 },{ address: '0x92e22427412dc8705b69c2db1b702d51586018f5',blockHash: '0x06cf0bd459caa91c9fd13a7b65875d300942648a975bf282813c4e1596258192',blockNumber: 4381899,data: '0x0000000000000000000000000000000000000000000000000000000000000006',logIndex: 4,removed: false,topics: [ '0xef0d7493287e1bf143771073deb917ba8ae1b8503a98a3d6d490d058e81d67ea','0x00000000000000000000000029f65c9a6f016ad76f5a26896343d3731267cc36' ],transactionHash: '0x12e3384bdba97c631bbaa5df27e94e6baeb9ee894ee80c7d9ce0e1b9944b70d7',transactionIndex: 20 },{ address: '0x92e22427412dc8705b69c2db1b702d51586018f5',blockHash: '0x06cf0bd459caa91c9fd13a7b65875d300942648a975bf282813c4e1596258192',blockNumber: 4381899,data: '0x00000000000000000000000029f65c9a6f016ad76f5a26896343d3731267cc360000000000000000000000000000000000000000000000000000000000000006',logIndex: 5,removed: false,topics: [ '0xcc9018de05b5f497ee7618d8830568d8ac2d45d0671b73d8f71c67e824122ec7' ],transactionHash: '0x12e3384bdba97c631bbaa5df27e94e6baeb9ee894ee80c7d9ce0e1b9944b70d7',transactionIndex: 20 } ]
data ====  [ '0x29f65c9a6f016ad76f5a26896343d3731267cc36',BigNumber { s: 1, e: 0, c: [ 6 ] } ]

分析日志可以知道。

  • 一共生成了3个日志。
  • topics的第一个值topics[0]是sha3(event名字(参数1类型,参数2类型))
  • 参数内容:如果event的参数是index,那就会在topics的值中。如果不是index,那就会在data中。

比较方便的解析方式:

let abi = "";
let SolidityEvent = require("web3/lib/web3/event.js");
let logParser =  (logs, abi) => {// pattern similar to lib/web3/contract.js:  addEventsToContract()let decoders = abi.filter(function (json) {return json.type === 'event';}).map(function(json) {// note first and third params required only by enocde and execute;// so don't call those!return new SolidityEvent(null, json, null);});return logs.map(function (log) {return decoders.find(function(decoder) {return (decoder.signature() == log.topics[0].replace("0x",""));}).decode(log);})
};
web3.eth.getTransactionReceipt("0x12e3384bdba97c631bbaa5df27e94e6baeb9ee894ee80c7d9ce0e1b9944b70d7",function(error, result){if(!error){// console.log("receipt ==== ",result);let logs = result.logs;let events = logParser(logs,JSON.parse(abi));console.log("logParser === ",events)}elseconsole.error(error);
});

转载于:https://my.oschina.net/kunBlog/blog/2873039

解析solidity的event log相关推荐

  1. PBlaze6 6530系列SSD的“黑匣子”——Persistent Event Log介绍

    在最新发布的PBlaze6 6530系列企业级PCIe 4.0 NVMe SSD中,我们加入了Persistent Event Log(简称"PEL")持久化事件日志功能.它是NV ...

  2. 详解 Solidity 事件Event

    很多同学对Solidity 中的Event有疑问,这篇文章就来详细的看看Solidity 中Event到底有什么用? 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊. ...

  3. win7产生大量evtx文件_Windows XML Event Log (EVTX)单条日志清除(四)——通过注入获取日志文件句柄删除当前系统单条日志记录...

    0x00 前言 Windows XML Event Log (EVTX)单条日志清除系列文章的第四篇,介绍第二种删除当前系统单条日志记录的方法:获得日志服务Eventlog对应进程中指定日志文件的句柄 ...

  4. Spark History Server和Event Log详解

    前言 Spark如何持久化event SHS启动参数 SHS工作流程 DiskCache 读取eventlog 参考 前言 这篇文章会overall的介绍一下Spark History Server和 ...

  5. Android 解读main log和event log日志信息

    ENV:Android M 6.0.1 一 分析main log 1.1 通过adb logcat输出的main log文件,每一行都是以如下格式作为开头信息 格式:timestamp PID TID ...

  6. windows 系统无法启动windows event log 服务

    windows 系统无法启动windows event log 服务 关键词:无法启动系统事件日志 尝试解决步骤 [1]权限:把如图中logsfile文件等都给local service [2]把C: ...

  7. HowTO: Create an Event Log Source in code, without the Permission errors

    在我的程序中需要使用EventLog来写日志,在一般的计算机上可以工作,但是在用户一个受限的计算机上却报错误:"The source was not found,but some or al ...

  8. [blog摘要]Exploring and Decoding ETW Providers using Event Log Channels

    这是一篇摘要,原文在这里 Exploring and Decoding ETW Providers using Event Log Channels (http://blogs.msdn.com/nt ...

  9. 无法打开计算机上的event log服务,Win7系统下启用Windows event log服务发生4201错误的正确解决方法...

    Windows event log服务会把程序与系统发送的错误消息记录在日志中,其中还包含了部分有用的诊断信息,近期有Win7用户在启用windows event log服务的时候,发生4201错误提 ...

最新文章

  1. write()和read()
  2. excel 小知识汇总
  3. JS 怎样模拟类的特性
  4. Nginx的应用之虚拟主机
  5. rsync算法原理及使用
  6. 用户体验是非常难琢磨的东西
  7. Android XmlPullParser 笔记
  8. python下int转日期_减去不同格式的日期并转换为Int - python
  9. 黄梯云,李一军.管理信息系统(第七版)[M].北京:高等教育出版社,2019.8 课后二维码选择题
  10. ElasticSearch常用搜索命令整理(长期更新...)
  11. redis.conf配置详细解析
  12. 苹果内存其他怎么清理_手机内存不足怎么清理才有效?
  13. 国外服务器 虚拟主机,虚拟主机国内国外什么区别
  14. DotEPUB:一键将网页转换成 EPUB 格式电纸书
  15. 学历真的是衡量一个人的首要条件吗?
  16. 关于 vue项目 中实现导入Excel表 + 预览生成的Excel
  17. Telephony--PhoneAccount
  18. 《原则》读后感(一)
  19. 课5 视频分镜的处理
  20. 大麦回忆录-maizuo开发

热门文章

  1. innodb和myisam的区别
  2. redis之intset
  3. lsof根据端口查进程
  4. linux中crontab命令的基本用法
  5. Linxu 进程描述符task_struct
  6. springboot:banner.txt
  7. spring23:Aspectj实现异常通知@AfterThrowing
  8. 将同一列的值用逗号分隔连接成一个字符串
  9. CentOS6.9中搭建FTP服务器
  10. Git与SVN区别 \git学习