Warum verwendet Solidity einen ungültigen Sprung anstelle eines ungültigen Opcodes für Würfe?

In der Version 0.4.9 von Solidity:

Interne Ausnahmen werden jetzt durch die Verwendung eines ungültigen Opcodes (0xfe) ausgelöst, manuelle Ausnahmen verwenden immer noch einen ungültigen Sprung.

Und

Codegenerator: Interne Fehler (Array außerhalb der Grenzen usw.) führen jetzt zu einer Umkehrung, indem anstelle eines ungültigen Sprungs eine ungültige Anweisung (0xfe - EIP141) verwendet wird. Ungültiger Sprung wird weiterhin für explizite Würfe beibehalten.

Warum der Unterschied? Gibt es einen Vorteil, ein ungültiges Sprungziel anstelle des 0xfe-Opcodes für explizite Throws zu verwenden?

Antworten (1)

Die ganze Idee hinter der Verwendung des ungültigen Sprungs besteht darin, das ganze Gas zu verbrennen und den Benutzer dafür zu bestrafen, dass er versucht, etwas zu tun, was er nicht durfte. Zunächst verwendeten alle Ausnahmen einen ungültigen Sprung, aber das kann auch dazu führen, dass Benutzer auf unfaire Weise bestraft werden: Wenn ein Benutzer ohne böse Absicht ein Array außerhalb der Grenzen verursacht, wurde automatisch sein gesamtes Gas verbrannt. Dies wurde durch den ungültigen Opcode ersetzt, während Entwickler Benutzer immer noch mit einem manuellen Wurf bestrafen können.

Ein ungültiger Opcode verbrennt auch alles Gas. So throwkann ein ungültiger Opcode anstelle eines ungültigen Sprungs verwendet werden. Können Sie erklären, warum in einem Fall "Dies wurde durch den ungültigen Opcode ersetzt" und im Fall des manuellen Wurfs ein ungültiger Sprung nicht durch einen ungültigen Opcode ersetzt wurde?
Ja, das habe ich falsch verstanden, der ungültige Opcode verbrennt tatsächlich auch Gas. Aber ungültige Opcodes für Programmfehler ermöglichen eine einfachere / differenziertere Fehlerberichterstattung: Es ist einfacher zu erkennen, ob der Code oder ein manueller Wurf der Grund für das Scheitern einer Transaktion ist. Habe ich zB nach einem Array-Wert gefragt, den ich nicht haben sollte, oder bin ich einfach außerhalb der Grenzen gesprungen?