解析solidity的event log
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相关推荐
- PBlaze6 6530系列SSD的“黑匣子”——Persistent Event Log介绍
在最新发布的PBlaze6 6530系列企业级PCIe 4.0 NVMe SSD中,我们加入了Persistent Event Log(简称"PEL")持久化事件日志功能.它是NV ...
- 详解 Solidity 事件Event
很多同学对Solidity 中的Event有疑问,这篇文章就来详细的看看Solidity 中Event到底有什么用? 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊. ...
- win7产生大量evtx文件_Windows XML Event Log (EVTX)单条日志清除(四)——通过注入获取日志文件句柄删除当前系统单条日志记录...
0x00 前言 Windows XML Event Log (EVTX)单条日志清除系列文章的第四篇,介绍第二种删除当前系统单条日志记录的方法:获得日志服务Eventlog对应进程中指定日志文件的句柄 ...
- Spark History Server和Event Log详解
前言 Spark如何持久化event SHS启动参数 SHS工作流程 DiskCache 读取eventlog 参考 前言 这篇文章会overall的介绍一下Spark History Server和 ...
- Android 解读main log和event log日志信息
ENV:Android M 6.0.1 一 分析main log 1.1 通过adb logcat输出的main log文件,每一行都是以如下格式作为开头信息 格式:timestamp PID TID ...
- windows 系统无法启动windows event log 服务
windows 系统无法启动windows event log 服务 关键词:无法启动系统事件日志 尝试解决步骤 [1]权限:把如图中logsfile文件等都给local service [2]把C: ...
- HowTO: Create an Event Log Source in code, without the Permission errors
在我的程序中需要使用EventLog来写日志,在一般的计算机上可以工作,但是在用户一个受限的计算机上却报错误:"The source was not found,but some or al ...
- [blog摘要]Exploring and Decoding ETW Providers using Event Log Channels
这是一篇摘要,原文在这里 Exploring and Decoding ETW Providers using Event Log Channels (http://blogs.msdn.com/nt ...
- 无法打开计算机上的event log服务,Win7系统下启用Windows event log服务发生4201错误的正确解决方法...
Windows event log服务会把程序与系统发送的错误消息记录在日志中,其中还包含了部分有用的诊断信息,近期有Win7用户在启用windows event log服务的时候,发生4201错误提 ...
最新文章
- write()和read()
- excel 小知识汇总
- JS 怎样模拟类的特性
- Nginx的应用之虚拟主机
- rsync算法原理及使用
- 用户体验是非常难琢磨的东西
- Android XmlPullParser 笔记
- python下int转日期_减去不同格式的日期并转换为Int - python
- 黄梯云,李一军.管理信息系统(第七版)[M].北京:高等教育出版社,2019.8 课后二维码选择题
- ElasticSearch常用搜索命令整理(长期更新...)
- redis.conf配置详细解析
- 苹果内存其他怎么清理_手机内存不足怎么清理才有效?
- 国外服务器 虚拟主机,虚拟主机国内国外什么区别
- DotEPUB:一键将网页转换成 EPUB 格式电纸书
- 学历真的是衡量一个人的首要条件吗?
- 关于 vue项目 中实现导入Excel表 + 预览生成的Excel
- Telephony--PhoneAccount
- 《原则》读后感(一)
- 课5 视频分镜的处理
- 大麦回忆录-maizuo开发