web3: Как мне пройти события myContract.myEvent?

Я использую следующий JS-код, чтобы получать уведомления о событиях Solidity и хорошо работает для входящих новых событий:

myContract.myEvent().watch((error, result) => {
  if (error)
    console.log('Error in myEvent event handler: ' + error);
  else
    console.log('myEvent: ' + JSON.stringify(result.args));
});

Я хотел бы использовать тот же код для инициализации приложения JS при запуске. например Я запускаю приложение JS на этапе 100, но уже были некоторые события, запущенные в 20 и 30. Эти два предыдущих события не обрабатываются с помощью кода выше. В качестве альтернативы я также пробовал через

myContract.myEvent((error, result) => {

и

myContract.myEvent({fromBlock: 0, toBlock: 'latest'}, (error, result) => {

Тем не менее эти два параметра не дают мне прошлых событий.

20 голосов | спросил Validity Labs - Sebastian 2 FebruaryEurope/MoscowbThu, 02 Feb 2017 13:00:50 +0300000000pmThu, 02 Feb 2017 13:00:50 +030017 2017, 13:00:50

3 ответа


16

Наконец-то я выяснил, как правильно использовать .get(), упомянутый в ответе Роланда:

myContract.myEvent({}, { fromBlock: 0, toBlock: 'latest' }).get((error, eventResult) => {
  if (error)
    console.log('Error in myEvent event handler: ' + error);
  else
    console.log('myEvent: ' + JSON.stringify(eventResult.args));
});

Стоит отметить, что объект eventResult - это массив, содержащий одну запись для вызова события:

[{
    "address": "0x80d346f14eb1bb47bc112b066f74ceb5e0a07c78",
    "blockNumber": 180173,
    "transactionIndex": 1,
    "transactionHash": "0x2c34b00a9b137a506afc6b80ccf159858415c48f403d357c35e509a03fe4c8bc",
    "blockHash": "0xc737758878120a70ed5f9d4fb412fc05231fbe5473e87e6f2194361537b85a4f",
    "logIndex": 2,
    "removed": false,
    "event": "myEvent",
    "args": {
        "id": "1"
    }
}, {
    "address": "0x80d346f14eb1bb47bc112b066f74ceb5e0a07c78",
    "blockNumber": 180179,
    "transactionIndex": 1,
    "transactionHash": "0x6372cc429ffe28c717f7e26c100da2e7395bd23ac466da20643299dfe57ed380",
    "blockHash": "0xcc6c13043ceeab8a3c5dbf4f4937b7e3d02c614256615cb8c3b63fdcb46f0d0a",
    "logIndex": 2,
    "removed": false,
    "event": "myEvent",
    "args": {
        "id": "2"
    }
}]
ответил Validity Labs - Sebastian 11 FebruaryEurope/MoscowbSat, 11 Feb 2017 12:28:58 +0300000000pmSat, 11 Feb 2017 12:28:58 +030017 2017, 12:28:58
8

Вместо .watch() используйте .get(). Может немного отставать, потому что события не сохраняются в состоянии-trie, за занавеской он сканирует все блоки, поэтому вы можете дать ему значение fromBlock

  

fromBlock: Номер | Строка - количество   самый ранний блок (последним может быть присвоен самый последний и   ожидающий в настоящее время поиск, блок). По умолчанию последний.

https://github.com/ethereum/wiki/wiki/JavaScript-API # параметры-29

ответил Roland Kofler 2 FebruaryEurope/MoscowbThu, 02 Feb 2017 14:23:08 +0300000000pmThu, 02 Feb 2017 14:23:08 +030017 2017, 14:23:08
0

Если в результате вы получите массив объектов:

, [объект-объект], [объект-объект], [объект-объект], [объект-объект] ...

, тогда вам нужно извлечь пару значений «args» внутри объектов:

    var event1;
    for(var i = 0; i < result.length ; i++){
      event1 = JSON.stringify(result[i].args);
      document.getElementById("TxAllEvents").innerHTML += event1;
    }
ответил Russo 9 42017vEurope/Moscow11bEurope/MoscowThu, 09 Nov 2017 02:26:53 +0300 2017, 02:26:53

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

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

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