Wie man die Vertragsausführung stoppt, ohne Ereignisse zu verlieren

Die Funktion revert() soll die Vertragsausführung stoppen und jede Änderung in der Blockchain mit Ausnahme von gemeldeten Ereignissen rückgängig machen. Das ist genau das, was ich brauche, aber es scheint mir, dass es nicht wie erwartet funktioniert. Im folgenden Beispiel mit remix.ethereum.org IDE und JS VM-Kette:

contract test {
    function a() public {
        L(1);
        revert();
    }

    event L(uint256 n);
}

Wenn eine () -Funktion auf JS VM aufgerufen wird, wird der folgende Fehler angezeigt:

... test.a errored: VM error: revert.
revert  The transaction has been reverted to the initial state.

Und es wurde kein Ereignis aufgezeichnet.

Habe assert(false), require(false) und throw() getestet, gleiches Ergebnis.

Haben Sie eine Idee, wie Sie den Vertrag beenden können, ohne Ereignisaufzeichnungen zu verlieren? Danke!

Es gibt schmutzige Tricks wie diesen gist.github.com/nmushegian/de35e6a389b12da4f9bc1a828b44c5a6 , um einen Versuchsfang zu emulieren.

Antworten (1)

Rückgängig machen, fordern, behaupten; Sie alle machen alle Statusänderungen rückgängig, einschließlich Ereignisse.

Wenn Sie die Ausführung der Funktion anhalten und dennoch ein Ereignis protokollieren möchten, müssen Sie if-else mit einer Rückgabe verwenden.

Zum Beispiel:

contract test {
    function a(uint someNumber) public returns(bool) {
        if(someNumber > 5){
          L(someNumber);
          return false; // if(someNumber is > 5 it will "halt" execution"
        }

        someNumber ++;
        // continue execution and do something with the number
        L(someNumber);
        return true;
    }

    event L(uint256 n);
}