Kurz erklärt:
Delegatecall ist ein Low-Level-Opcode der Ethereum Virtual Machine (EVM), mit dem ein Smart Contract den Programmcode eines anderen Vertrags ausführt, dabei jedoch den eigenen Speicher sowie die ursprünglichen Werte von msg.sender und msg.value beibehält.
Herkunft und Einordnung
Der Opcode wurde im Zuge der Homestead-Aktualisierung des Ethereum-Netzwerks im Jahr 2016 eingeführt und ist in EIP-7 spezifiziert. Er ersetzte den zuvor eingesetzten Opcode CALLCODE, der die ursprüngliche Absenderadresse nicht korrekt weiterreichte. Delegatecall gehört zur Familie der Aufruf-Instruktionen der EVM, zu der auch CALL und STATICCALL zählen, und ist ein grundlegender Baustein für die Wiederverwendung von Vertragslogik.
Funktionsweise
Bei einem gewöhnlichen Aufruf (CALL) wird der Code eines Zielvertrags in dessen eigenem Kontext ausgeführt: Änderungen betreffen den Speicher des Zielvertrags. Delegatecall kehrt dieses Prinzip um. Der aufrufende Vertrag lädt lediglich den Code der Zieladresse und führt ihn so aus, als wäre es sein eigener Code. Sämtliche Zustandsänderungen wirken sich auf den Speicher des aufrufenden Vertrags aus, und die Kontextvariablen bleiben unverändert.
Entscheidend ist dabei die Übereinstimmung der Speicherbelegung (Storage-Layout). Da Delegatecall Speicherpositionen anhand ihrer numerischen Slots anspricht, müssen der aufrufende und der aufgerufene Vertrag ein kompatibles Layout ihrer Zustandsvariablen aufweisen, damit die Daten korrekt zugeordnet werden.
Anwendungsfälle
Delegatecall bildet die technische Grundlage austauschbarer Vertragslogik. Am häufigsten wird der Opcode in Proxy-Mustern verwendet, bei denen ein dauerhafter Speichervertrag (Proxy) die Logik an einen separaten Implementierungsvertrag delegiert. Dieses Konzept ermöglicht die Aktualisierung von Vertragslogik, ohne die gespeicherten Daten oder die Vertragsadresse zu verändern.
Weitere Einsatzbereiche sind gemeinsam genutzte Bibliotheken sowie Kontostrukturen im Bereich der Kontoabstraktion. Auch verwandte Techniken wie Create2 und Multicall werden häufig zusammen mit Proxy-Architekturen eingesetzt.
Sicherheitsaspekte
Da delegierter Code vollen Zugriff auf den Speicher des aufrufenden Vertrags erhält, gilt Delegatecall als potenziell risikobehaftet. Unterschiedliche Speicher-Layouts, nicht initialisierte Proxy-Verträge oder das Delegieren an nicht vertrauenswürdige Adressen können zu unbeabsichtigten Zustandsänderungen führen. In der Fachliteratur werden solche Konstellationen als eigene Klasse von Programmierfehlern beschrieben und regelmäßig in Sicherheitsprüfungen (Audits) untersucht.
Häufige Fragen
Worin unterscheidet sich Delegatecall von einem normalen Call?
Ein normaler Call führt den Zielcode im Kontext des Zielvertrags aus und verändert dessen Speicher. Delegatecall führt den Zielcode im Kontext des aufrufenden Vertrags aus und verändert dessen Speicher, wobei msg.sender und msg.value erhalten bleiben.
Wofür wird Delegatecall hauptsächlich genutzt?
Der Opcode ist die technische Grundlage von Proxy-Mustern für aktualisierbare Verträge sowie von gemeinsam genutzten Bibliotheken.
Was bedeutet Storage-Layout-Kompatibilität?
Delegatecall spricht Speicherpositionen über numerische Slots an. Aufrufender und aufgerufener Vertrag müssen ihre Zustandsvariablen in derselben Reihenfolge anlegen, damit Daten korrekt zugeordnet werden.
Seit wann existiert Delegatecall?
Der Opcode wurde 2016 mit der Homestead-Aktualisierung eingeführt und in EIP-7 spezifiziert. Er löste den älteren Opcode CALLCODE ab.
Warum gilt Delegatecall als sicherheitskritisch?
Delegierter Code kann den gesamten Speicher des aufrufenden Vertrags verändern. Fehlerhafte Layouts oder das Delegieren an nicht vertrauenswürdige Adressen können zu ungewollten Zustandsänderungen führen.
Zusammenfassung
Delegatecall ist ein 2016 mit Homestead eingeführter EVM-Opcode, der fremden Vertragscode im Speicher- und Aufrufkontext des aufrufenden Vertrags ausführt. Er bildet die Grundlage von Proxy-Mustern und aktualisierbaren Smart Contracts, erfordert jedoch ein kompatibles Storage-Layout und gilt als sicherheitskritisch.
Weiterführende Quellen
- EIP-7: DELEGATECALL: eips.ethereum.org
- Solidity Documentation – Contracts and Delegatecall: docs.soliditylang.org