фильтровать проиндексированные события из браузера с помощью web3.js

У меня есть определенный контракт, который регистрирует 2 события:

 myEvent(string data, uint32 indexed id),
 myEvent1(string data, uint32 indexed id). 

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

  1. Как получить все события с переданным id.

  2. когда я пытаюсь получить событие из txHash, он возвращает данные события, но правильно декодируется только строковый параметр. тип uint32 возвращается как большое число. Как решить их две проблемы??

Не могли бы вы скопировать сюда весь блок javascript, который вы используете для выполнения операции фильтрации?

Ответы (3)

Здесь я перечисляю пример того, как я применил фильтр событий

В этом примере я использовал имя кандидата в качестве параметра фильтра. Во-вторых, он ищет от блока 0 до самого последнего.

Надеюсь это поможет.

Декларация о мероприятии - Контракт Solidity

event RegisterCandidate(uint256 indexed
eventTimeStamp, address indexed _from, bytes32 indexed _candidateName);

Код на Java-скрипте

var event = contractInstance.RegisterCandidate( {_candidateName: "Abc"}, {fromBlock: 0, toBlock: 'latest'});

    event.watch(function(error, response)
    {
       //once the event has been detected, take actions as desired
        var data = 'from: ' + response.args._from+"<br>candidateName: "+web3.toUtf8(response.args._candidateName) +"<br>";
    });

В вашем конкретном случае это будет:

var myEvent = contract.myEvent({id: 1});

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

    var data = result["args"]["data"];
    var id = result["args"]["id"]; // always 1
    // Do Something 
});

Который смотрел бы только события с id = 1.

Как получить все события с переданным id.

Как указано @cees-van-wijk, это извлекает каждое новое событие:

var myEvent = contract.myEvent({id: 1});
myEvent.watch((error, result) => {
    var data = result["args"]["data"];
    var id = result["args"]["id"]; // always 1
    // Do Something 
});

это извлекает все предыдущие события

myEvent.get((error, result) => {
    var data = result["args"]["data"];
    var id = result["args"]["id"]; // always 1
    // Do Something 
});`

когда я пытаюсь получить событие из txHash, он возвращает данные события, но правильно декодируется только строковый параметр. тип uint32 возвращается как большое число. Как решить их две проблемы??

Вы можете легко декодировать большинство типов uint, используяNumber(uint)