Постоянное состояние события в смарт-контракте с web3

Когда событие (Something) запускается в контракте, консоль страницы регистрирует вывод, как и предполагалось (через somethingEvent.watch()), но когда я перезагружаю страницу, консоль записывает тот же вывод. Предназначено ли самое последнее событие для сохранения или я неправильно его использую? Спасибо.

// Solidity
event Something(string message);

function doSomething(string newMessage) payable {
    Something(newMessage);
}

// Web3
var somethingEvent = contractInstance.Something();

somethingEvent.watch(function(error, result) {
  console.log(result.args.message);
});

person totalnoob    schedule 20.01.2018    source источник


Ответы (1)


Это произойдет всякий раз, когда вы вызываете 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