Ist es sicher, revert() aufzurufen, anstatt einen Wert zurückzugeben?

Ich habe das folgende Stück Code:

function func() public returns (bool) {
    if (some condition on msg.sender) {
        do some stuff
        return true;
    }
    revert();
}

Der Compiler (0.4.24) gibt keine Warnung darüber aus, obwohl nicht alle Ausführungspfade einen Wert zurückgeben.

Natürlich könnte ich revert()gleich am Anfang anrufen (mit einer entgegengesetzten Bedingung) und dieses Problem vermeiden, aber aus internen Überlegungen zum Codierungsstil bevorzuge ich es wie oben gezeigt.

Jetzt weiß ich, dass zum Beispiel in C++ eine Funktion eine Ausnahme werfen kann, anstatt einen Wert zurückzugeben, und alles bleibt "im Takt". Ich nehme also an, dass es hier dasselbe sein könnte, aber ich möchte trotzdem sicher sein, dass kein Potenzial für Stapelbeschädigung oder ähnliches besteht (aufgrund der Tatsache, dass nichts in den Stapel geschoben wird, wenn die Funktion beendet wird).

Laut den Dokumenten gibt der revertOpcode tatsächlich etwas zurück.

Aber ich bin mir nicht sicher, ob die revert Funktion dies tut, und selbst wenn ja, wäre sie nicht unbedingt vom gleichen Typ wie in meiner Funktion ( boolin diesem Fall).

Also ... muss ich mir hier Sorgen machen oder "kümmert" sich die ausgelöste Ausnahme um den zurückgegebenen Wert?

Danke schön!

Antworten (1)

In der Regel revertwird die gesamte Transaktion aufgebläht und zurückgesetzt, sodass Sie sich keine Gedanken über falsche Rückgabewerte machen müssen - die gesamte Transaktion schlägt fehl. Es gibt keine Möglichkeit, diese Art von Ausnahme abzufangen , und daher kann sie nicht verhindert werden, wenn der Code eine revert.

Es gibt einige geringfügige Ausnahmen von dieser Regel, nämlich delegatecallund ähnliche Funktionalitäten. Weitere Informationen zu diesem Verhalten (und zum Zurücksetzen im Allgemeinen) finden Sie unter: https://solidity.readthedocs.io/en/v0.4.24/control-structures.html#error-handling-assert-require-revert-and-exceptions