Это произойдет всякий раз, когда вы вызываете watch()
, а последний номер блока совпадает с номером предыдущего выполнения. Когда событие «запускается», все, что делает EVM, — это записывает информацию о событии в журнал после успешного завершения транзакции.
Когда вы добавляете часы в контракт, вы можете указать, с какого блока вы хотите начать прослушивание. Если вы ничего не передаете (как это делает ваш код), по умолчанию используется последний блок (см. отфильтровать документацию по API). Таким образом, когда вы перезагружаете страницу, а новый блок не добавлен в цепочку, вы получите то же самое событие.
Если вы хотите избежать повторяющихся событий, используйте result.blockNumber
для запоминания последнего прочитанного блока и увеличивайте его на 1 всякий раз, когда устанавливаете новые часы.
let blockNumber = 'latest'; // should come from some state initially set to 'latest'
...
var somethingEvent = contractInstance.Something({}, {fromBlock: blockNumber);
somethingEvent.watch(function(error, result) {
blockNumber = result.blockNumber + 1;
console.log(result.args.message);
});
Обратите внимание, что watch
может быть не лучшим вариантом для использования в этом случае. Это зависит от состояния вашего клиента. Вы всегда должны вызывать stopWatching
всякий раз, когда закончите прослушивание событий. Если вы не хотите настраивать часы, вы также можете использовать get
, который будет отправлять обратно все события, соответствующие критериям вашего фильтра.
person
Adam Kipnis
schedule
20.01.2018