Ich bin über dieses EIP gestolpert , das den revert
Opcode 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 return
und revert
dasselbe 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 opcode
Fehler 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?
revert
ist 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 .
ähm
Inline assembly: Support revert (EIP140) as an opcode.
Benjaminion
ähm
Ilan Dshare
Benjaminion
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).