Solidity v0.4.10 führte die Funktionen revert()
und require()
ein, zusammen mit Unterstützung für den REVERT
opcode . Soweit ich das beurteilen kann, bedeutet dies, dass jeder Vertrag, der mit erstellt wurde, ^0.4.10
ein anderes Verhalten throw
nach Metropole ausdrückt.
Hintergrund:
Gemäß der Solidity Exceptions-Dokumentation :
Eine vom Benutzer bereitgestellte Ausnahme wird in den folgenden Situationen generiert:
- Calling-Wurf.
- Aufrufen von require mit einem Argument, das als false ausgewertet wird.
und
Solidity führt intern eine Wiederherstellungsoperation (instruction
0xfd
) durch, wenn eine vom Benutzer bereitgestellte Ausnahme ausgelöst wird.
Fazit:
Es scheint also, dass kürzlich zusammengestellte/bereitgestellte Verträge den 0xfd
Opcode enthalten werden, der auf Homestead nur eine INVALID
Operation ist, aber REVERT
nach Metropole werden wird.
Frage:
Ist meine Schlussfolgerung richtig?
Gibt es Fälle, in denen das geänderte Verhalten problematisch sein könnte?
Ja, das ist laut diesem Gespräch richtig .
Alle undefinierten Anweisungen verhalten sich genauso wie INVALID. Und ja, das Verhalten
0xfd
ändert sich bei Metropolis, aber vor oder nach Metropolis,0xfd
wirft immer. Der Unterschied besteht darin, ob dem Anrufer ein Teil der Leistung zur Verfügung gestellt wird ... und auch, dass der Rest des Gases zurückerstattet wird.