Wiki/Calldata vs. Memory: Parameter-Übergabe in Solidity
Calldata vs. Memory: Parameter-Übergabe in Solidity - Biturai Wiki Knowledge
EXPERTE | BITURAI KNOWLEDGE

Calldata vs. Memory: Parameter-Übergabe in Solidity

Das Verständnis des Unterschieds zwischen Calldata und Memory ist grundlegend für die effiziente und sichere Entwicklung von Smart Contracts in Solidity. Diese Datenspeicherorte bestimmen, wie Funktionsargumente und temporäre Variablen

Biturai Knowledge
Biturai Knowledge
Research-Bibliothek
Aktualisiert: 27.6.2026
Technisch geprüft

Struktur, Lesbarkeit, interne Verlinkung und SEO-Metadaten wurden automatisiert geprüft. Der Artikel wird fortlaufend aktualisiert und dient der Bildung, nicht als Finanzberatung.

Definition

In Solidity, der Programmiersprache für Ethereum-Smart-Contracts, müssen Entwickler explizit verwalten, wo Daten gespeichert werden. Dies ist ein entscheidender Aspekt des Smart-Contract-Designs, da verschiedene Datenspeicherorte unterschiedliche Auswirkungen auf Gaskosten, Mutabilität und Persistenz haben. Unter diesen sind Calldata und Memory zwei temporäre Datenspeicherorte, die hauptsächlich zur Handhabung von Funktionsparametern und Zwischenberechnungen während der Ausführung einer Transaktion verwendet werden.

Calldata: Ein unveränderlicher, schreibgeschützter und nicht modifizierbarer Bereich, in dem Funktionsargumente für externe und öffentliche Funktionen gespeichert werden. Es ist ein temporärer Puffer, der nur für die Dauer des Funktionsaufrufs existiert und danach automatisch bereinigt wird. Daten in Calldata werden nicht in den Memory-Bereich kopiert, es sei denn, dies wird explizit angefordert, was es für große, nicht modifizierbare Eingaben äußerst gaseffizient macht.

Memory: Ein veränderlicher, temporärer Bereich, in dem Daten während der Ausführung einer Funktion gespeichert werden. Er wird für interne Funktionsargumente, Rückgabewerte und alle temporären Variablen verwendet, die innerhalb einer Funktion manipuliert oder konstruiert werden müssen. Daten im Memory-Bereich werden während der Funktionsausführung zugewiesen und freigegeben und sind flexibler als Calldata, da sie Modifikationen zulassen.

Kernaussage

Der Hauptunterschied zwischen Calldata und Memory liegt in ihrer Mutabilität und den Auswirkungen auf die Gaskosten, insbesondere bei externen Funktionsaufrufen. Calldata ist streng schreibgeschützt und die gaseffizienteste Option für die Übergabe großer, nicht modifizierbarer Daten an externe Funktionen. Memory, obwohl flexibler aufgrund seiner Mutabilität, verursacht höhere Gaskosten, wenn es für externe Funktionsparameter verwendet wird, da die Daten zuerst aus den Eingabedaten der Transaktion in den Memory-Bereich des Vertrags kopiert werden müssen. Die Wahl des richtigen Datenspeicherorts ist nicht nur eine stilistische Präferenz; es ist eine grundlegende Entscheidung, die die wirtschaftliche Rentabilität und Sicherheit eines Smart Contracts direkt beeinflusst.

Für Entwickler gilt die Faustregel, Calldata wann immer möglich für externe Funktionsparameter zu verwenden, insbesondere für Arrays und Strukturen, wenn die Daten innerhalb der Funktion nicht geändert werden müssen. Wenn eine Datenmanipulation erforderlich ist oder bei internen Funktionsaufrufen, wird Memory zur notwendigen Wahl. Diese strategische Auswahl ist von größter Bedeutung, um den Gasverbrauch zu optimieren und eine effiziente Vertragsausführung auf der Ethereum Virtual Machine (EVM) zu gewährleisten.

Mechanik

Wenn eine externe Funktion eines Solidity-Smart-Contracts aufgerufen wird, werden die an diese Funktion übergebenen Argumente zunächst in Calldata gespeichert. Diese Daten sind Teil der Transaktionseingabe und befinden sich in einem speziellen, isolierten Segment der Ausführungsumgebung der EVM. Entscheidend ist, dass Calldata nicht Teil des Zustands des Vertrags oder seines Hauptspeicherbereichs ist. Es handelt sich um einen separaten, temporären Puffer, aus dem die EVM direkt lesen kann. Da es schreibgeschützt ist und kein Kopieren in den teureren Memory-Bereich erfordert, es sei denn, es wird explizit für eine Modifikation benötigt, bietet es erhebliche Gaseinsparungen, insbesondere bei komplexen Datentypen wie großen Arrays oder Strings. Die EVM kann direkt auf Calldata zugreifen, was es zu einer effizienten Methode macht, eingehende Daten zu verarbeiten, ohne zusätzliche Kopierkosten zu verursachen.

Im Gegensatz dazu ist Memory ein flüchtiger, byte-adressierbarer Bereich, den ein Vertrag während seiner Ausführung nutzen kann. Wenn eine Funktion temporäre Variablen erstellen, Daten manipulieren oder Rückgabewerte vorbereiten muss, weist sie Speicherplatz im Memory-Bereich zu. Im Gegensatz zu Calldata können Daten im Memory-Bereich frei geändert werden. Wenn beispielsweise eine externe Funktion ein Array in Calldata empfängt, es aber sortieren oder filtern muss, muss das Array zuerst von Calldata in Memory kopiert werden. Dieser Kopiervorgang verursacht Gaskosten. Interne Funktionen, die innerhalb desselben Vertrags aufgerufen werden, übergeben Argumente und Rückgabewerte typischerweise über Memory. Das Verständnis des Lebenszyklus von Memory – wie es zugewiesen, verwendet und nach einem Funktionsaufruf wieder freigegeben wird – ist entscheidend, um häufige Fallstricke wie Out-of-Gas-Fehler oder unerwartetes Verhalten aufgrund von Speicherüberschreibungen zu vermeiden, obwohl der Solidity-Compiler dies bei grundlegenden Typen oft automatisch handhabt. Bei Referenztypen ist jedoch eine explizite Angabe des Datenspeicherorts obligatorisch, was Entwickler dazu zwingt, diese Mechaniken zu berücksichtigen.

Trading-Relevanz

Für Teilnehmer im dezentralen Finanzwesen (DeFi) und im allgemeinen Blockchain-Handel führt die Wahl zwischen Calldata und Memory direkt zu spürbaren wirtschaftlichen Auswirkungen. Jede Operation auf der Ethereum-Blockchain, einschließlich des Aufrufs von Smart-Contract-Funktionen, verursacht Gaskosten. Diese Kosten werden in Ether bezahlt und stellen den Rechenaufwand dar, der zur Ausführung der Transaktion erforderlich ist. Verträge, die hinsichtlich des Datenstandortmanagements schlecht optimiert sind, verbrauchen mehr Gas, was zu höheren Transaktionsgebühren für die Nutzer führt. In einem Handelsumfeld mit hohem Volumen können sich selbst kleine Unterschiede in der Gaseffizienz zu erheblichen Kosten summieren, was die Rentabilität für Händler und die allgemeine Wettbewerbsfähigkeit eines DeFi-Protokolls beeinträchtigt.

Man stelle sich eine dezentrale Börse (DEX) oder ein Kreditprotokoll vor. Wenn ein Nutzer mit einer Funktion interagiert, die eine komplexe Struktur oder ein großes Array von Adressen als Argument entgegennimmt (z.B. für Batch-Genehmigungen oder Multi-Asset-Swaps), und der Vertrag diese Daten unnötigerweise in Memory kopiert, obwohl Calldata ausreichen würde, zahlt der Nutzer mehr Gas. Diese erhöhten Kosten können das Protokoll im Vergleich zu gaseffizienteren Alternativen weniger attraktiv machen. Für Arbitrageure oder Hochfrequenzhändler ist die Minimierung der Gaskosten von größter Bedeutung, da sie ihre Gewinnmargen direkt beeinflusst. Daher müssen Entwickler, die handelsbezogene Smart Contracts erstellen, die Datenspeicherorte akribisch optimieren, um sicherzustellen, dass ihre Anwendungen wirtschaftlich rentabel und wettbewerbsfähig bleiben und den Nutzern ein reibungsloseres und kostengünstigeres Erlebnis bieten. Die zugrunde liegende Mechanik der Datenverarbeitung beeinflusst direkt die Benutzererfahrung und das Wirtschaftsmodell jeder Blockchain-Anwendung.

Risiken

Das Hauptrisiko, das mit dem Missverständnis oder Missbrauch von Calldata und Memory verbunden ist, dreht sich um die Gasinneffizienz. Die falsche Verwendung von Memory für große, unveränderliche externe Funktionsargumente, wenn Calldata angemessener wäre, führt zu unnötigem Datenkopieren und höherem Gasverbrauch. Dies erhöht nicht nur die Transaktionskosten für die Nutzer, sondern kann einen Vertrag auch anfällig für Denial-of-Service-Angriffe machen, wenn ein Angreifer Transaktionen erstellen kann, die absichtlich einen hohen Gasverbrauch auslösen, wodurch möglicherweise die Gelder des Vertrags entzogen oder die Interaktion damit unerschwinglich teuer wird. Darüber hinaus könnten Verträge mit hohem Gasbedarf in Zeiten von Netzwerküberlastungen vom Markt verdrängt werden, wodurch sie unbrauchbar oder wirtschaftlich unrentabel werden.

Neben den Gaskosten kann die unsachgemäße Handhabung von Datenspeicherorten subtile Sicherheitslücken einführen. Während die Unveränderlichkeit von Calldata von Natur aus vor bestimmten Arten der Datenmanipulation innerhalb der Funktion schützt, erfordert die Mutabilität von Memory ein sorgfältiges Management. Wenn ein Entwickler nicht sorgfältig ist, könnten temporäre Daten im Memory-Bereich versehentlich überschrieben oder falsch gelesen werden, was zu unerwartetem Vertragsverhalten oder sogar ausnutzbaren Fehlern führen könnte. Wenn beispielsweise ein Zeiger auf einen Memory-Speicherort verwendet wird, nachdem die Daten an diesem Speicherort von einem anderen Teil der Funktion geändert wurden, könnte dies zu einem Logikfehler führen. Obwohl das Typsystem und der Compiler von Solidity einige Schutzmaßnahmen bieten, ist ein tiefes Verständnis der Speicherung und des Zugriffs auf Daten entscheidend für das Schreiben robuster und sicherer Smart Contracts, insbesondere beim Umgang mit komplexen Datenstrukturen und externen Aufrufen, die sensible Finanzoperationen beinhalten.

Geschichte und Beispiele

Die Konzepte von Calldata und Memory sind seit ihren Anfängen integraler Bestandteil von Solidity und der Ethereum Virtual Machine (EVM) und haben sich mit der Reifung der Sprache weiterentwickelt. Anfangs waren die Unterscheidungen und expliziten Anforderungen an Datenspeicherorte weniger streng, was zu gängigen Mustern führte, bei denen Entwickler standardmäßig Memory verwendeten, selbst wenn Calldata angemessener gewesen wäre. Da jedoch die Gaskosten im Ethereum-Netzwerk, insbesondere mit dem Aufkommen komplexer DeFi-Protokolle, zu einem immer wichtigeren Faktor wurden, wurde die Bedeutung der Gasoptimierung durch ein korrektes Datenstandortmanagement von größter Bedeutung. Solidity-Versionen, insbesondere ab 0.5.0, führten strengere Regeln ein, die explizite Datenspeicherort-Spezifizierer für Referenztypen (Arrays, Strukturen, Mappings) erforderten und Entwickler dazu zwangen, bewusst zwischen Storage, Memory und Calldata zu wählen. Diese Änderung war eine direkte Reaktion auf die Notwendigkeit vorhersehbarerer Gaskosten und sichererer Vertragsinteraktionen.

Betrachten wir ein praktisches Beispiel: eine Vertragsfunktion function processData(uint[] calldata _data) external pure returns (uint), die ein Array von vorzeichenlosen Ganzzahlen entgegennimmt. Durch die Angabe von calldata weiß der Compiler, dass _data eine schreibgeschützte Referenz auf die Eingabedaten der Transaktion ist. Die Funktion kann _data durchlaufen und Berechnungen durchführen, ohne die Gaskosten für das Kopieren des gesamten Arrays in den Memory-Bereich zu verursachen. Wenn die Funktion jedoch das Array ändern müsste, müsste sie als function processData(uint[] memory _data) external returns (uint) deklariert werden, und das Array würde zuerst von Calldata in Memory kopiert, was zusätzliche Gaskosten verursacht. Ein weiteres Beispiel ist eine Funktion, die einen String zurückgibt: function getName() public view returns (string memory). Hier wird memory verwendet, da der String konstruiert oder abgerufen und dann temporär im Memory-Bereich gespeichert wird, bevor er an den Aufrufer zurückgegeben wird. Diese expliziten Deklarationen sind nicht nur syntaktischer Zucker; sie sind grundlegende Anweisungen an die EVM, wie Daten zu behandeln sind, und beeinflussen direkt die Effizienz und Sicherheit des bereitgestellten Smart Contracts.

Häufige Missverständnisse

Eines der häufigsten Missverständnisse bezüglich Calldata und Memory ist die Annahme, dass sie austauschbar sind oder dass die Wahl lediglich eine Frage der Präferenz ist. Dies ist falsch; ihre unterschiedlichen Eigenschaften und Gasauswirkungen machen die Wahl hochrelevant. Entwickler verstehen oft nicht, dass Calldata von Natur aus schreibgeschützt ist und nicht geändert werden kann. Der Versuch, eine Calldata-Variable zu ändern, führt zu einem Kompilierungsfehler. Diese Unveränderlichkeit ist ein Merkmal, keine Einschränkung, da sie erhebliche Gaseinsparungen durch Vermeidung von Datenkopien ermöglicht. Ein weiteres häufiges Missverständnis ist, dass die Verwendung von Memory immer teurer ist als Calldata. Während das Kopieren von Daten von Calldata nach Memory Gas verursacht, kann der Overhead für sehr kleine, festgroße Datentypen vernachlässigbar sein, und Memory bietet die Flexibilität der Mutabilität. Die erheblichen Gaseinsparungen durch Calldata werden am deutlichsten bei großen, dynamischen Datenstrukturen wie Arrays und Strings.

Ein weiterer Bereich der Verwirrung entsteht bei der Betrachtung interner versus externer Funktionsaufrufe. Für externe und öffentliche Funktionen ist Calldata der Standard und effizienteste Speicherort für Referenztyp-Argumente, die nicht geändert werden. Für interne und private Funktionen werden Argumente jedoch typischerweise im Memory-Bereich übergeben. Diese Unterscheidung ist entscheidend, da die EVM interne Aufrufe anders behandelt und das Konzept von Calldata als Transaktionseingabe weniger relevant ist. Darüber hinaus verwechseln einige Entwickler diese temporären Datenspeicherorte möglicherweise mit Storage, dem persistenten, On-Chain-Datenspeicherort für Zustandsvariablen. Obwohl alle drei Datenspeicherorte sind, ist Storage permanent und wesentlich teurer zu beschreiben, während Calldata und Memory flüchtig sind. Ein klares Verständnis des Zwecks, des Umfangs und des Kostenmodells jedes Speicherorts ist unerlässlich, um ineffizienten Code und potenzielle Schwachstellen in Solidity-Smart-Contracts zu vermeiden.

Zusammenfassung

Calldata und Memory sind zwei unterschiedliche, temporäre Datenspeicherorte in Solidity, die jeweils spezifische Zwecke bei der Ausführung von Smart Contracts erfüllen. Calldata ist ein unveränderlicher, schreibgeschützter Bereich, der hauptsächlich für externe Funktionsargumente verwendet wird und erhebliche Gaseffizienz für große Dateneingaben bietet, die keine Modifikation erfordern. Memory hingegen ist ein veränderlicher, temporärer Bereich, der für interne Funktionsargumente, Rückgabewerte und alle Daten verwendet wird, die während der Ausführung einer Funktion manipuliert werden müssen. Die strategische Wahl zwischen diesen beiden ist von größter Bedeutung für die Optimierung der Gaskosten, die Verbesserung der Vertragssicherheit und die Gewährleistung der wirtschaftlichen Rentabilität dezentraler Anwendungen. Entwickler müssen ihre Mechanik, Mutabilität und Gasauswirkungen verstehen, um effizienten, robusten und sicheren Solidity-Code zu schreiben, der sich direkt auf die Benutzererfahrung und die allgemeine Gesundheit des Blockchain-Ökosystems auswirkt. Die Priorisierung von Calldata für nicht modifizierbare externe Eingaben und Memory für interne Datenmanipulation ist eine Best Practice, die die Grundlage für eine qualitativ hochwertige Smart-Contract-Entwicklung bildet.

OKX EU · Offizieller Biturai-Partner

OKX EU

Entdecke das aktuelle Angebot von OKX EU über den offiziellen Biturai-Partnerlink. Produkte und Verfügbarkeit können je Land abweichen.

OKX EU ansehen

Partnerlink · Biturai kann bei Nutzung eine Vergütung erhalten · keine Anlageberatung

OKX EU

Haftungsausschluss

Dieser Artikel dient ausschließlich zu Informationszwecken. Die Inhalte stellen keine Finanzberatung, Anlageempfehlung oder Aufforderung zum Kauf oder Verkauf von Wertpapieren oder Kryptowährungen dar. Biturai übernimmt keine Gewähr für die Richtigkeit, Vollständigkeit oder Aktualität der Informationen. Investitionsentscheidungen sollten stets auf Basis eigener Recherche und unter Berücksichtigung der persönlichen finanziellen Situation getroffen werden.

Transparenz

Biturai kann KI-gestützte Werkzeuge zur Recherche, Strukturierung oder Aktualisierung von Wiki-Artikeln einsetzen. Redaktionell geprüfte Artikel werden separat gekennzeichnet; alle Inhalte bleiben Bildungsinhalte und ersetzen keine eigene Prüfung.