Kurz erklärt:
Calldata ist der schreibgeschützte Datenbereich einer Transaktion auf der Ethereum Virtual Machine, in dem die Eingabeinformationen eines Aufrufs – typischerweise die aufgerufene Funktion und ihre Parameter – an einen Smart Contract übermittelt werden.
Einordnung und Herkunft
Das Konzept entstand mit der Einführung von Ethereum 2015 als Teil der EVM-Architektur. Die virtuelle Maschine unterscheidet mehrere Datenbereiche: den flüchtigen Arbeitsspeicher (Memory), den dauerhaften Speicher (Storage), den Stack und eben die Calldata. Letztere enthält die vom Aufrufer übergebenen Rohdaten und ist innerhalb der Ausführung unveränderlich. Für Entwickler wurde der Bereich mit der Programmiersprache Solidity als eigenes Datenlocation-Schlüsselwort calldata zugänglich, das insbesondere bei Funktionsparametern verwendet wird.
Aufbau und Kodierung
Bei einem üblichen Funktionsaufruf beginnt die Calldata mit einem vier Byte langen Funktionsselektor, der aus den ersten vier Byte des Hash der Funktionssignatur gebildet wird. Danach folgen die Parameter, kodiert nach dem Application Binary Interface. Feste Typen werden in 32-Byte-Blöcken abgelegt, dynamische Typen wie Arrays oder Zeichenketten über Offsets referenziert. Ein Vertrag liest anhand des Selektors, welche Funktion angesprochen ist, und dekodiert die nachfolgenden Bytes entsprechend der erwarteten Parametertypen.
Kosten und Effizienz
Calldata verursacht Gebühren pro übermittelter Datenmenge: Nicht-Null-Bytes sind teurer als Null-Bytes. Da Calldata schreibgeschützt ist und nicht in den teureren Arbeitsspeicher kopiert werden muss, gilt ihre Nutzung bei Funktionsparametern als effizienter als der Umweg über Memory. Diese Eigenschaft ist ein wiederkehrendes Thema der Gas-Optimierung. Auf Layer-2-Rollups gewinnt Calldata zusätzliche Bedeutung, da Transaktionsdaten zur Verankerung auf der Basisschicht veröffentlicht werden und deren Umfang die Kosten maßgeblich bestimmt.
Bedeutung für Analyse
Für die Nachverfolgung und forensische Untersuchung von Transaktionen ist Calldata eine zentrale Informationsquelle. Aus dem Funktionsselektor und den dekodierten Parametern lässt sich rekonstruieren, welche Aktion ein Aufruf auslösen sollte, etwa ein Token-Transfer, ein Tausch oder eine Vertragsinteraktion. Werkzeuge zur Blockchain-Analyse dekodieren Calldata anhand bekannter ABIs und öffentlicher Selektor-Verzeichnisse, um Rohbytes in lesbare Funktionsaufrufe zu übersetzen.
Häufige Fragen
Wofür wird Calldata verwendet?
Sie übermittelt die Eingabedaten einer Transaktion an einen Smart Contract, insbesondere den Funktionsselektor und die Aufrufparameter, und teilt dem Vertrag so mit, welche Aktion mit welchen Werten ausgeführt werden soll.
Was ist der Funktionsselektor?
Die ersten vier Byte der Calldata, abgeleitet aus dem Hash der Funktionssignatur. Anhand des Selektors erkennt der Vertrag, welche seiner Funktionen aufgerufen wird.
Worin unterscheidet sich Calldata von Memory?
Calldata ist der schreibgeschützte Eingabebereich eines Aufrufs, während Memory ein beschreibbarer, aber flüchtiger Arbeitsspeicher ist. Das direkte Lesen aus Calldata vermeidet teure Kopiervorgänge.
Warum ist Calldata für Layer-2-Netzwerke wichtig?
Rollups veröffentlichen Transaktionsdaten auf der Basisschicht, um ihre Zustände nachvollziehbar zu machen. Der Umfang der Calldata beeinflusst dabei einen großen Teil der anfallenden Kosten.
Lässt sich Calldata nachträglich analysieren?
Ja, sie ist Teil der öffentlichen Transaktionsdaten. Mit dem passenden ABI oder über Selektor-Verzeichnisse lassen sich die Rohbytes in lesbare Funktionsaufrufe und Parameter dekodieren.
Zusammenfassung
Calldata ist der schreibgeschützte Eingabedatenbereich einer EVM-Transaktion und übermittelt Funktionsselektor und Parameter an einen Smart Contract. Sie ist nach dem ABI kodiert, kostet Gebühren je nach Datenmenge und dient in der Analyse als zentrale Quelle zur Rekonstruktion von Aufrufen.
Weiterführende Quellen
- Ethereum Yellow Paper (EVM-Ausführungsmodell): ethereum.github.io
- Solidity Dokumentation: ABI-Spezifikation: docs.soliditylang.org