Was ist die ordnungsgemäße Verwendung von Inline-Assembly-Revert und wie rufe ich zurückgegebene Daten ab, die daran übergeben wurden?

Ich bin über dieses EIP gestolpert , das den revertOpcode beschreibt, der so aussieht, als ob Sie spezifischere Fehler "werfen" können, indem Sie einen Speicherzeiger mit dem Opcode übergeben (ebenfalls kurz in den Dokumenten beschrieben ). Beachten Sie in den Dokumenten, dass returnund revertdasselbe Eingabeformat erhalten.

Bisher habe ich diese Funktion als Beispiel:

function throwError(bytes _error) constant returns (bytes32) {
    assembly {
        calldatacopy(0xff, 0, calldatasize)
        return(add(0xff, 68), 32)
    }
}

Es funktioniert wie erwartet, kopiert die als Funktionsparameter übergebene Zeichenfolge und gibt sie zurück. Wenn ich jedoch so returnändere :revert

function throwError(bytes _error) constant returns (bytes32) {
    assembly {
        calldatacopy(0xff, 0, calldatasize)
        revert(add(0xff, 68), 32)
    }
}

Alles, was ich zurückbekomme, ist ein normaler invalid opcodeFehler von web3, truffle und remix beim Testen mit testrpc. Ich sehe keinen Grund, warum das nicht funktionieren sollte; Gibt es etwas, das ich hier vermisse?

Antworten (1)

revertist noch nicht in der EVM implementiert, so dass es derzeit tatsächlich zu einem ungültigen Opcode führt (in diesem Fall ist es wirklich ein ungültiger Opcode, kein Proxy für throw). Es wird Teil des Metropolis-Updates sein .

Die Funktion ist in Version 0.4.10 aufgeführt :Inline assembly: Support revert (EIP140) as an opcode.
Ja, der korrekte Revert-Opcode wird vom Compiler eingefügt, 0xfd, aber die EVM erkennt ihn noch nicht, also barf es und wird dies bis zum ersten Metropolis-Fork tun.
Ohh das ist interessant. Danke für diese Klarstellung, sonst hätte ich stundenlang versucht, das zu debuggen!
gibt es Neuigkeiten zu diesem Thema? existiert Opcode-Revert mit vollem Funktionsumfang?
Ja, wurde in der Byzantium-REVERT Gabel implementiert und funktioniert einwandfrei. Die aktuelle Version von Solidity implementiert jedoch nicht die Fähigkeit, die von Revert zurückgegebenen Daten (der Rücksetzungsgrund) zu verarbeiten. Dies sollte Real Soon Now verfügbar sein (vielleicht ist es sogar ein experimentelles Feature. Ich bin zu faul, es zu überprüfen).