Auf Solidity scheint das Aufrufen des Ereignisses vom Modifikator fehlzuschlagen

Zwei Modifikatoren für einen Vertrag lösen eine „Ausnahme während der Ausführung. (ungültiger Opcode)“ aus. Fehler, wenn er nicht wie erwartet erfüllt wird. Beide rufen ein Ereignis auf, wenn die von ihnen überprüfte Bedingung nicht erfüllt ist. Ich denke also, die Ausnahme kommt vom Aufrufen des Ereignisses für den Modifikator. Ist das korrekt?

Das Ereignisprotokoll ist dieses:

event Error(string error);

Und die Modifikatoren sind die folgenden:

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

Der vollständige Quellcode des Vertrags ist unter https://gist.github.com/computerphysicslab/f362383f9d3fed26becba48b934bbcfc verfügbar

Wenn Modifikatoren keine Ereignisse aufrufen können, ist es dann nicht möglich, eine Funktion zu protokollieren, die fehlschlägt, weil ihre Modifikatoren nicht erfüllt wurden?

Danke!

Antworten (1)

Sie können Ereignisse in Modifikatoren verwenden. In Ihrem Beispiel haben Sie thrownach dem Aufruf des Ereignisses. throwspult auch Ereignisse zurück, sodass Sie keine Ereignisse sehen, wenn Sie throw. Einfach entfernen und alles funktioniert gut.

Hier ein komplettes Minimalbeispiel:

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 {

    }
}