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!
Puede usar eventos en modificadores. En su ejemplo, tiene un throw
después de llamar al evento. throw
tambié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 {
}
}