Javascript

如何使用 web3.js 解析交易回執日誌?

  • September 1, 2018

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'
}

引用自:https://ethereum.stackexchange.com/questions/1381