Два модификатора в контракте вызывают «Исключение во время выполнения (недопустимый код операции)». ошибка, когда не удовлетворяется, как ожидалось. Оба они вызывают событие, когда условие, которое они проверяют, не выполняется. Поэтому я предполагаю, что исключение связано с вызовом события для модификатора. Это верно?
Журнал событий такой:
event Error(string error);
А модификаторы следующие:
modifier onlyOwner() {
if (msg.sender != owner) {
Error('Mortal: onlyOwner function called by user that is not owner'); throw;
}
_;
}
modifier onlyIssuer() {
if (!issuers[phoneNumbers[msg.sender]]) {
Error('Mobile: onlyIssuer function called by user that is not an authorized issuer'); throw;
}
_;
}
Полный исходный код контракта доступен по адресу https://gist.github.com/computerphysicslab/f362383f9d3fed26becba48b934bbcfc .
Итак, если модификаторы не могут вызывать события, нельзя ли каким-то образом зарегистрировать функцию, которая не работает из-за того, что ее модификаторы не были выполнены?
Спасибо!
Вы можете использовать события в модификаторах. В вашем примере у вас есть throw
после вызова события. throw
также перематывает события, поэтому вы не видите события, когда вы throw
. Просто удалите это, и все работает хорошо.
Вот полный минимальный пример:
contract c {
address owner;
event Error(string error);
modifier onlyOwner() {
if (msg.sender != owner) {
Error('Mortal: onlyOwner function called by user that is not owner');
}
_;
}
function c() {
// constructor sets owner
owner = msg.sender;
}
function f() onlyOwner {
}
}