日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

解析solidity的event log

發(fā)布時(shí)間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解析solidity的event log 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

參考文檔。

例子代碼如下:

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個(gè)event。他們的index不同。生成的log數(shù)據(jù)結(jié)構(gòu)不一樣。

  • CreateAssertAll全部是index。
  • CreateAssertOne有一個(gè)是idnex。
  • Create全部都不是index。
    我在ropsten上調(diào)用了這個(gè)方法。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個(gè)日志。
  • topics的第一個(gè)值topics[0]是sha3(event名字(參數(shù)1類型,參數(shù)2類型))
  • 參數(shù)內(nèi)容:如果event的參數(shù)是index,那就會(huì)在topics的值中。如果不是index,那就會(huì)在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); });

轉(zhuǎn)載于:https://my.oschina.net/kunBlog/blog/2873039

總結(jié)

以上是生活随笔為你收集整理的解析solidity的event log的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。