Ereignisprotokoll in Solidity

Ich habe das folgende Verhalten des Ereignisprotokolls bemerkt und wollte bestätigen, ob es so funktionieren sollte.

Code unten. Die Funktion create erfordert zwei Felder. Ich habe "require" eingefügt, um zu überprüfen, ob die Felder ungleich Null und nicht leer sind.

Wenn ich nur ein einzelnes Feld eingebe - sagen Sie "Name", schlägt es wie erwartet fehl. Ich habe ein leeres Feld für den Namen und 10 für die Nummer eingegeben als: "",10. Solidity liest es richtig und identifiziert, welches Element das Problem hat.

Wenn jedoch die Funktion "Erstellen" Fehler ausgibt, werden keine der vorhergehenden Protokollanweisungen innerhalb der Funktion angezeigt. Ich hatte erwartet, dass die Protokolle nacheinander gedruckt und angehalten werden, wenn der Fehler erkannt wird.

Ich hatte folgende Fragen:

  1. Wenn die Funktion fehlschlägt - ignoriert sie alle Ereignisprotokolle innerhalb der Funktion? Wenn ja, gibt es eine andere Möglichkeit, dies auszuführen, um die Protokolle zu Debugging-Zwecken nacheinander anzuzeigen.
  2. Wenn "require" fehlschlägt: Gibt es automatisch default zurück (was in diesem Fall falsch ist). Das ist wahrscheinlich gut, weil wir nicht nach jeder "Require"-Prüfung Write-Return-Anweisungen haben.

-

    pragma solidity ^0.4.15;
    contract ABC {
        bytes32 public name;
        uint public number;

        event Log(string _myString);

        function ABC (bytes32 _name, uint _number) public {
            Log("Creating Object");
            name = _name;
            number = _number;

        }
    }    
    contract XYZ {

        ABC myABC;

        event Log(string _myString);

        function create(bytes32 _name, uint _number) public returns (bool isSuccess) {

            Log("checking name");
            require(_name != "");

            Log("name valid, now checking number");
            require(_number != 0);

            Log("name and number non-empty, creating a new contract");
            myABC = new ABC(_name,_number);

            Log("new contract created");

            return true;

        }
    }

Antworten (1)

In Solidity gibt es keine partielle Funktionsausführung. Wenn an irgendeinem Punkt in der Funktion ein Fehler ausgelöst wird, schlägt die gesamte Funktion fehl und keines Ihrer Protokolle wird protokolliert. Tatsächlich würden alle Protokolle in demselben Transaktionsobjekt erscheinen, das nach Abschluss der gesamten Funktion erstellt wurde, sie würden nicht einzeln ausgegeben.

Sie können es sich requireähnlich wie eine vorstellen if (condition) revert(), bei der keine Zustandsänderungen vorgenommen werden; Wenn es einen Wurf gibt, wird alles in den Anfangszustand zurückgesetzt (dh nichts passiert), außer dem Gas, das zum Ausführen des Funktionsaufrufs verwendet wird.

Wenn Sie Schritt für Schritt debuggen möchten, können Sie remixd ( https://remix.ethereum.org/ ) verwenden, das über ein schrittweises Debugging-Tool verfügt.

Es wird auch an späteren Versionen von Solidity gearbeitet, um Fehlermeldungen aussagekräftiger zu machen, sodass Sie in späteren Versionen möglicherweise anstelle von „ungültigem Opcode“ Ihre Wurfnachricht beschreiben können.

Danke @carlolm für deine schnelle Antwort. Es hilft, die Konzepte klarer zu machen.