В Solidity вызов события из модификатора кажется неудачным

Два модификатора в контракте вызывают «Исключение во время выполнения (недопустимый код операции)». ошибка, когда не удовлетворяется, как ожидалось. Оба они вызывают событие, когда условие, которое они проверяют, не выполняется. Поэтому я предполагаю, что исключение связано с вызовом события для модификатора. Это верно?

Журнал событий такой:

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 .

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

Спасибо!

Ответы (1)

Вы можете использовать события в модификаторах. В вашем примере у вас есть 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 {

    }
}