Coin Brief ENDE

EIP-7979 erhält Opcode-Nummern für CALLSUB, CALLDEST und RETURNSUB in der EVM

Zu EIP-7979, „Call and Return Opcodes for the EVM", wurden im EIPs-Repository zwischen dem 11. und 12. Oktober sechs Pull Requests gemergt. Zentral ist PR 12481 von Autor Greg Colvin: Er weist den drei neuen Instruktionen ihre Opcode-Werte zu – CALLDEST = 0xBB, CALLSUB = 0xBC, RETURNSUB = 0xBF – und zieht alle Referenzimplementierungen und Tests nach, die noch Platzhalter nutzten. Das EIP bleibt ein Entwurf; für ein Netzwerk-Upgrade ist damit nichts eingeplant.

Das Problem. Die EVM kennt keine Instruktion, um eine Unterroutine aufzurufen und zurückzukehren. Compiler bauen beides mit JUMP nach und nehmen die Rücksprungadresse vom Datenstapel. Das kostet laut Vorschlag Bytes und Gas – und, das ist der Kern, verschleiert den Kontrollfluss: Ein Rücksprung ist ein Sprung, dessen Ziel ein Datum ist, also muss ein Analysewerkzeug jedes mögliche Ziel in Betracht ziehen. Das begleitende EIP-8173 argumentiert, dass eine solche Analyse quadratische oder schlechtere Laufzeit haben kann – für Online-Anwendungen wie Bytecode-Validierung, Vorabkompilierung beim Deployment oder JIT-Kompilierung ein Denial-of-Service-Risiko.

Was die drei Opcodes tun. CALLSUB nimmt ein Ziel vom Datenstapel, legt PC + 1 auf einen eigenen Rücksprungstapel und springt. Ist das Ziel kein CALLDEST oder liegen bereits 1.024 Einträge auf dem Rücksprungstapel, endet die Ausführung mit einem Ausnahmefehler. CALLDEST markiert den Einstieg einer Unterroutine; wie JUMPDEST tut es sonst nichts und kostet ebenfalls 1 Gas. Es ist zugleich ein gültiges JUMP-Ziel, sodass ein Compiler einen Aufruf in einen Endsprung verwandeln kann. RETURNSUB nimmt die oberste Adresse vom Rücksprungstapel und setzt dort fort.

EIP-7979 erhält Opcode-Nummern für CALLSUB, CALLDEST und RETURNSUB in der EVM
EIP-7979 erhält Opcode-Nummern für CALLSUB, CALLDEST und RETURNSUB in der EVM — Coin Brief

Vertragscode kann den Rücksprungstapel weder lesen noch schreiben. Die Autoren nennen die Änderung abwärtskompatibel; 0xBD und 0xBE bleiben bewusst frei für mögliche Mehrfachverzweigungen.

Versprochene Gewinne. Im einfachen Beispiel des EIP – Aufruf einer Routine, die eine Zahl quadriert – braucht die CALLSUB-Fassung 29 % weniger Bytes und 32 % weniger Gas als die sprungbasierte; mit wachsendem, besser optimiertem Code schrumpft der Vorteil, räumen die Autoren ein. Den größeren Nutzen sehen sie bei Compilern: Code ohne dynamische Sprünge lässt sich in einem linearen Durchgang prüfen und vorab oder zur Laufzeit kompilieren. EOF, RISC-V oder Zero-Knowledge-Ausführung verbaue das Design nicht.

Was die Merges änderten. Neben der Nummerierung portierten die PRs die Regel für das „Framing" pro Einstiegspunkt in den C-Validator, glichen den Text mit EIP-8173 ab und brachten redaktionelle Korrekturen. Der Autor meldet 47 von 47 Testvektoren und 500 Fuzz-Fälle bestanden; weitere 4.000 kontrollflusslastige Programme liefern in Python- und C-Validator dasselbe Ergebnis. Laut EIP wurde KI-Unterstützung genutzt, vor allem für Referenzimplementierung und Tests.

Quellen: EIPs PR 12481 — https://github.com/ethereum/EIPs/pull/12481 ; EIP-7979 — https://eips.ethereum.org/EIPS/eip-7979

Primärquelle
Ethereum EIPs (GitHub)
https://github.com/ethereum/EIPs/pull/12481