Javascript
如何使用 web3.js 解析交易回執日誌?
web3 中的事件解析器為事件提供了很好的解析功能,我使用它來將所有事件記錄到文件中,但是很難使用它來查看特定事務的單個事件以進行自動化測試,因為它會導致不必要且困難的在不需要時管理並發方面。
當我使用 web3 獲得交易結果時,我手頭有交易收據,這是同步檢查結果並應用通過/失敗測試標準的最佳時機。
我想解析收據的日誌部分,但在 web3 中找不到這樣做的函式。它存在嗎?
這樣做:你需要從 web3 中提取程式碼,如果你的前端使用 webpack 或 browserify 之類的東西捆綁,它會工作得最好:
var SolidityCoder = require("web3/lib/solidity/coder.js"); var log = receipt.logs[0]; var data = SolidityCoder.decodeParams(["string", "uint"], log.data.replace("0x", ""));
在這種情況下,我們正在解碼包含兩個變數的日誌數據,一個是字元串類型,一個是 uint。
編輯:
如果您有可用的 ABI,則可以檢測與該 ABI 相關的事件:
var SolidityCoder = require("web3/lib/solidity/coder.js"); // You might want to put the following in a loop to handle all logs in this receipt. var log = receipt.logs[0]; var event = null; for (var i = 0; i < abi.length; i++) { var item = abi[i]; if (item.type != "event") continue; var signature = item.name + "(" + item.inputs.map(function(input) {return input.type;}).join(",") + ")"; var hash = web3.sha3(signature); if (hash == log.topics[0]) { event = item; break; } } if (event != null) { var inputs = event.inputs.map(function(input) {return input.type;}); var data = SolidityCoder.decodeParams(inputs, log.data.replace("0x", "")); // Do something with the data. Depends on the log and what you're using the data for. }
您現在可以使用該
web3.eth.abi.decodeLog
功能(web3 1.0)。文件中的範例:
web3.eth.abi.decodeLog([{ type: 'string', name: 'myString' },{ type: 'uint256', name: 'myNumber', indexed: true },{ type: 'uint8', name: 'mySmallNumber', indexed: true }], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000748656c6c6f252100000000000000000000000000000000000000000000000000', ['0x000000000000000000000000000000000000000000000000000000000000f310', '0x0000000000000000000000000000000000000000000000000000000000000010']); > Result { '0': 'Hello%!', '1': '62224', '2': '16', myString: 'Hello%!', myNumber: '62224', mySmallNumber: '16' }