En Solidity, el evento de llamada desde el modificador parece fallar

Dos modificadores en un contrato arrojan una "Excepción durante la ejecución. (código de operación no válido)". error al no quedar satisfecho como se esperaba. Ambos están llamando a un evento cuando no se cumple la condición que verifican. Así que supongo que la excepción proviene de llamar al evento en el modificador. ¿Es eso correcto?

El registro de eventos es este:

event Error(string error);

Y los modificadores son los siguientes:

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;
    }
    _;
}

El código fuente completo del contrato está disponible en https://gist.github.com/computerphysicslab/f362383f9d3fed26becba48b934bbcfc

Entonces, si los modificadores no pueden llamar eventos, ¿no es posible registrar de alguna manera una función que falla porque no se cumplieron sus modificadores?

¡Gracias!

Respuestas (1)

Puede usar eventos en modificadores. En su ejemplo, tiene un throwdespués de llamar al evento. throwtambién está rebobinando eventos, por lo que no ve eventos cuando throw. Simplemente elimine eso y todo funciona bien.

Aquí un ejemplo mínimo completo:

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 {

    }
}