Как проанализировать журнал получения транзакций с помощью web3.js?

Синтаксический анализатор событий в web3 обеспечивает приятную синтаксическую разборку для событий, и я использую его для регистрации всех событий в файле, но очень сложно использовать для просмотра отдельных событий для конкретной транзакции для автоматического тестирования, поскольку она вызывает ненужным и трудно управляемым аспектом параллелизма, когда нет необходимости в нем.

Когда я получаю результат транзакции с помощью web3, у меня есть квитанция транзакции в руке, и это идеальное время для синхронно проверять результат и применять критерии теста pass /fail.

Я хотел бы проанализировать раздел журнала квитанции, но не могу найти функцию в web3 для этого. Он существует?

23 голоса | спросил Paul S 15 FebruaryEurope/MoscowbMon, 15 Feb 2016 12:05:32 +0300000000pmMon, 15 Feb 2016 12:05:32 +030016 2016, 12:05:32

5 ответов


10

Тим:

Большое спасибо за указатель. Вы заставили меня, наконец, понять некоторые из внутренних элементов web3.js.

Я нашел более чистый способ сделать это, который охватывает все угловые случаи довольно сложного формата сообщений журнала (например, индексация). Я просто использовал SolidityEvent из web3, чтобы выполнить уже проверенную работу для меня.

Ниже приведен код. Я имею этот код в github , включая тестовый код .

// XXX move this to a hook function
var SolidityEvent = require("web3/lib/web3/event.js");
Pudding.logParser = function (logs, abi) {

    // pattern similar to lib/web3/contract.js:  addEventsToContract()
    var 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);
    })
}
ответил Paul S 16 MarpmWed, 16 Mar 2016 20:50:38 +03002016-03-16T20:50:38+03:0008 2016, 20:50:38
31

Сделайте это: вам нужно будет вытащить код из web3, и он лучше всего работает, если ваш интерфейс подключен с помощью чего-то вроде webpack или браузера:

var SolidityCoder = require("web3/lib/solidity/coder.js");
var log = receipt.logs[0];
var data = SolidityCoder.decodeParams(["string", "uint"], log.data.replace("0x", ""));

В этом случае мы дешифрируем данные журнала, который содержит две переменные, одну строку и один uint.

EDIT:

Если у вас есть доступный 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.
}
ответил Tim Coulter 23 FebruaryEurope/MoscowbTue, 23 Feb 2016 22:13:13 +0300000000pmTue, 23 Feb 2016 22:13:13 +030016 2016, 22:13:13
2

Для web3.js 1.0 используйте следующее:

contractInstance.inputs = [{"indexed": false, "name": "_id", "type": "uint256"}]; //event abi
contractInstance._decodeEventABI({data: '0x0'}); //event raw data

Выход

{
  returnValues: 
   Result {
     '0': '1',
     _id: '1',
  },
  raw: {
    data: '0x0'
  }
}
ответил Eugene 10 52017vEurope/Moscow11bEurope/MoscowFri, 10 Nov 2017 14:50:05 +0300 2017, 14:50:05
1

После получения транзакции (tr) вы знаете номер блока транзакции (tr.blockNumber). Итак, вы можете сделать следующее:

myContract.MyEvent (
  {},
  {fromBlock: tr.blockNumber, toBlock: tr.blockNumber}).
    get ().
      filter (function (e) {
        return e.transactionHash == tr.transactionHash
      });

Это приведет к возврату массива всех событий типа MyEvent, сгенерированных контрактом myContract в транзакции, связанной с получением транзакции tr.

ответил Mikhail Vladimirov 2 32016vEurope/Moscow11bEurope/MoscowWed, 02 Nov 2016 18:00:05 +0300 2016, 18:00:05
0

С web3.js 0.20.6.

$ node
> var AllEvents = require('web3/lib/web3/allevents')
undefined
> var decodeEventsForContract = (C, tr) => {
    const ae = new AllEvents(C._web3, C.abi, C.address);

    // ae.decode mutates the args, so we deep copy
    return JSON.parse(JSON.stringify(tr)) 
      .logs
      .filter(l => l.address === C.address)
      .map(l => ae.decode(l));
  }
undefined
> decodeEventsForContract(MyTokenContract, txreceipt);
[ { logIndex: 0,
    transactionIndex: 0,
    transactionHash: '0xbc68d5ddc391fab84cd633a77dbc815cbc42546a13de9d123f7a5b820faa3cb4',
    blockHash: '0xb604998aa0b6bece492530c9cbab494349a31b18a34067f225e1b59613952051',
    blockNumber: 21,
    address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
    type: 'mined',
    event: 'Transfer',
    args: 
     { from: '0x0000000000000000000000000000000000000000',
       to: '0x627306090abab3a6e1400e9345bc60c78a8bef57',
       value: [BigNumber] } },
  { logIndex: 1,
    transactionIndex: 0,
    transactionHash: '0xbc68d5ddc391fab84cd633a77dbc815cbc42546a13de9d123f7a5b820faa3cb4',
    blockHash: '0xb604998aa0b6bece492530c9cbab494349a31b18a34067f225e1b59613952051',
    blockNumber: 21,
    address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
    type: 'mined',
    event: 'Mint',
    args: 
     { to: '0x627306090abab3a6e1400e9345bc60c78a8bef57',
       value: [BigNumber],
       minter: '0x627306090abab3a6e1400e9345bc60c78a8bef57' } } ]
ответил pkoch 28 MarpmWed, 28 Mar 2018 18:22:00 +03002018-03-28T18:22:00+03:0006 2018, 18:22:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132