Выдать событие, когда оператор require не работает

Я хотел бы иметь возможность регистрировать результат условия:

if(time > 5) {
    emit Result("time is larger than 5");
} else {
    emit Result("time is less than 5");
}

Это будет работать нормально, но при использовании requireинструкции:

  require(time > 5);
  emit Result("time is larger than 5");

Я могу зарегистрировать событие только в случае requireуспеха.

Если requireпоявляется в модификаторе:

modifier OnlyLargerThan5() {
  require(time > 5);
  emit Result("time is larger than 5");
  _;
}

Есть ли способ зарегистрировать оба случая (больше > 5 > меньше), кроме if..elseутверждений?

Ответы (1)

Заявление if...elseявляется полностью допустимым вариантом, и я бы предложил его.

Что-то, что вы можете сделать, если хотите, это включить сообщение в оператор require. Это не будет событием, но будет выглядеть примерно так:

require(time > 5, "time is less than 5");
emit Result("time is larger than 5");
Записывается ли сообщение из инструкции require в блокчейн и можно ли его отследить (как событие)?
Я так не думаю. Наиболее логичным решением будет использование if...elseоператора. Вы не сможете зарегистрировать какие-либо данные, если транзакция будет отменена.
Ну, это похоже. Проблема в том, что моя функция (которая генерирует события) вызывается другим контрактом, который, в свою очередь, может вернуться ... поэтому ничто не может гарантировать, что я действительно генерирую свои события.
Правильный. Одно из самых больших обсуждений в Solidity касается внешних обращений к другим контрактам. Вы можете написать идеальную функцию, но если есть другой контракт, который полагается на нее или на которую она полагается, то теперь есть вероятность сбоя/вектора атаки.