Marktkapitalisierung: $2.8337T 0.60%
Volumen (24h): $136.9463B -23.72%
Angst- und Gier-Index:

28 - Furcht

  • Marktkapitalisierung: $2.8337T 0.60%
  • Volumen (24h): $136.9463B -23.72%
  • Angst- und Gier-Index:
  • Marktkapitalisierung: $2.8337T 0.60%
Kryptos
Themen
Cryptospedia
Nachricht
Cryptostopics
Videos
Top Cryptospedia

Sprache auswählen

Sprache auswählen

Währung wählen

Kryptos
Themen
Cryptospedia
Nachricht
Cryptostopics
Videos

Wie funktioniert Array-Speicher in Solidity und wie hoch sind die Kosten?

Dynamic arrays in Solidity store length in a slot, with elements placed at `keccak256(slot) + index`, ensuring deterministic, collision-free storage.

Nov 23, 2025 at 11:59 am

Array-Speicher in Solidität verstehen

1. Arrays in Solidity werden im Vertragsspeicher gespeichert, der über Funktionsaufrufe und Transaktionen hinweg persistent ist. Wenn ein dynamisches Array deklariert wird, z. B. uint[] öffentliche Werte , enthält der dem Array zugewiesene Slot nur die Länge des Arrays. Die tatsächlichen Datenelemente werden in einem keccak256-Hash der Steckplatznummer des Arrays gespeichert, was eine sichere und deterministische Standortzuordnung ermöglicht.

2. Jedes Element im Array wird in einem Speicherslot platziert, der sich aus der Formel keccak256(slot) + index ergibt. Dieser Mechanismus stellt sicher, dass selbst wenn mehrere Arrays in einem Vertrag vorhanden sind, deren Daten nicht kollidieren. Da der Ethereum-Speicher auf 256-Bit ausgerichtet ist, kann jeder Steckplatz einen vollständigen uint256-Wert oder einen gleichwertigen Wert enthalten. Größere Typen können sich über mehrere Steckplätze erstrecken.

3. Für Arrays fester Größe reserviert der Compiler aufeinanderfolgende Speicherplätze, beginnend mit der Position der deklarierten Variablen. Ein festes Array wie uint[3] ids verwendet genau drei benachbarte Slots. Es werden keine Metadaten wie die Länge gespeichert, da die Größe zur Kompilierzeit bekannt ist, was den Zugriff direkter und in Bezug auf Gas etwas kostengünstiger macht.

4. Verschachtelte Arrays erhöhen die Komplexität erheblich. Ein zweidimensionales dynamisches Array berechnet den Basisstandort mit derselben Hashing-Methode und wendet dann Offsets basierend auf den Indizes des inneren Arrays an. Zugriffsmuster werden aufgrund mehrerer Hashing-Ebenen und erhöhter SLOAD-Vorgänge beim Lesen oder Schreiben teurer.

5. Durch das Packen von Werten in Strukturen oder die Verwendung kleinerer Integer-Typen (z. B. uint128 statt uint256), wenn möglich, können mehrere Variablen in einen einzigen Speicherbereich passen. Dies reduziert die Gesamtzahl der verwendeten Slots und senkt die Gaskosten sowohl für die Bereitstellung als auch für Zustandsänderungen, die diese Variablen betreffen.

Gaskosten im Zusammenhang mit Array-Operationen

1. Das Anhängen an ein dynamisches Array über push() verursacht Kosten, die je nachdem, ob das hinzugefügte Element Null oder ungleich Null ist, variieren. Wenn der gespeicherte Wert ungleich Null ist, führt dies zu einem SSTORE-Vorgang mit Gaskosten von 20.000, wenn ein zuvor leerer Slot festgelegt wird. Nachfolgende Überschreibungen von Werten ungleich Null kosten gemäß den EIP-1283-Regeln 5.000 Gas, vorausgesetzt, der Slot enthält bereits Daten.

2. Das Lesen eines Elements aus einem Array löst einen SLOAD-Vorgang aus, der 2.100 Gas pro Zugriff kostet. Häufige Iterationen über große Arrays sollten in der On-Chain-Logik vermieden werden, da jeder Lesevorgang diese Grundkosten vervielfacht. Off-Chain-Indexierungsdienste eignen sich besser zum Abrufen vollständiger Datensätze.

3. Das Entfernen von Elementen wird für dynamische Arrays grundsätzlich nicht unterstützt, es sei denn, eine manuelle Verschiebung ist implementiert. Der Aufruf von pop() entfernt den letzten Artikel und erstattet 15.000 Gas beim Freimachen eines Lagerplatzes, was einen Anreiz zur Bereinigung des ungenutzten Zustands darstellt. Das Entfernen von Elementen aus der Mitte erfordert jedoch das Verschieben aller nachfolgenden Elemente, was zu einer O(n)-Berechnung und einem hohen Gasverbrauch führt.

4. Die Initialisierung großer Arrays während der Vertragserstellung erhöht die Bereitstellungskosten erheblich. Jeder voreingestellte Wert verbraucht Speicherinitialisierungsgas. Oft ist es effizienter, Arrays leer zu initialisieren und sie schrittweise durch Benutzerinteraktionen zu füllen, wodurch die Kosten auf mehrere Transaktionen verteilt werden.

5. Temporär innerhalb von Funktionen verwendete Speicherarrays schreiben nicht in den persistenten Speicher und vermeiden somit vollständig SSTORE-Kosten. Diese eignen sich ideal für Zwischenberechnungen, können jedoch keine Daten über den Transaktionsbereich hinaus speichern. Die Verwendung von Speicherarrays für die Stapelverarbeitung vor dem Schreiben ausgewählter Ergebnisse in den Speicher optimiert die Gesamteffizienz.

Optimierungstechniken für eine effiziente Array-Nutzung

1. Bevorzugen Sie Zuordnungen gegenüber Arrays, wenn ein wahlfreier Zugriff per Schlüssel erforderlich ist. Eine Zuordnung wie „mapping(uint => address)“ ermöglicht zeitkonstante Suchvorgänge ohne den Mehraufwand für Iterationen oder Längenverwaltung. Zuordnungen beseitigen auch Bedenken hinsichtlich Indexgrenzen und Größenänderungen.

2. Gehen Sie bei einzelnen Array-Elementen sparsam mit delete um. Das manuelle Setzen eines Elements auf Null kann günstiger sein als das Löschen, insbesondere wenn keine Rückerstattung erfolgt. Für eine vollständige Bereinigung maximiert der wiederholte Aufruf von pop(), bis das Array leer ist, die Gasrückerstattung aus den freigegebenen Speicherplätzen.

3. Begrenzen Sie die Offenlegung von Array-Inhalten in der Kette. Durch das Ausgeben von Ereignissen mit Array-Daten können externe Systeme den Status rekonstruieren, ohne direkt aus dem Speicher zu lesen. Ereignisse kosten weniger als permanente Speicherschreibvorgänge und unterstützen die Filterung über indizierte Parameter.

4. Implementieren Sie Checkpointing- oder Linked-List-Muster für Workloads mit vielen Anhängen. Indem Verträge nur Deltas oder Referenzen zwischen Einträgen speichern, reduzieren sie die redundante Datenspeicherung und minimieren kostspielige Reorganisationen. Dieser Ansatz eignet sich gut zum Verfolgen historischer Zustände oder Benutzeraktivitätsprotokolle.

5. Nutzen Sie Optimierungen auf Baugruppenebene vorsichtig. Inline-Yul-Code kann Speicherorte schneller berechnen als High-Level-Solidity-Konstrukte, birgt jedoch das Risiko einer falschen Adressierung. Nur fortgeschrittene Entwickler sollten eine Speichermanipulation auf niedriger Ebene versuchen und dabei gründliche Tests über verschiedene Compilerversionen hinweg sicherstellen.

Häufig gestellte Fragen

Was passiert, wenn Sie auf einen Array-Index außerhalb der Grenzen zugreifen? Der Zugriff auf einen Index außerhalb der aktuellen Array-Länge löst einen ungültigen Opcode aus, der den gesamten verbleibenden Gas verbraucht und die Transaktion rückgängig macht. Die Grenzüberprüfung muss vor dem Zugriff explizit im Code durchgeführt werden.

Können Arrays zwischen Verträgen als Argumente übergeben werden? Ja, Arrays können in internen und externen Funktionsaufrufen übergeben werden. Calldata-Arrays sind für große Eingaben effizient, da sie das Kopieren in den Speicher vermeiden. Externe Schnittstellen erfordern eine ABI-Codierung und unterstützen sowohl statische als auch dynamische Typen.

Gibt es eine Grenze für die Größe eines dynamischen Arrays? Der theoretische Grenzwert wird durch die verfügbaren Gas- und Blockgrößenbeschränkungen eingeschränkt. Zu den praktischen Einschränkungen zählen die steigenden Kosten für das Anhängen und Iterieren. Bei Verträgen besteht die Gefahr, dass die Transaktionsgasgrenzen erreicht werden, wenn übermäßig große Arrays in der Kette verarbeitet werden.

Verbrauchen leere Array-Deklarationen Speicherplatz? Wenn Sie ein Array deklarieren, ohne es zu initialisieren, wird seine Länge auf Null gesetzt und ein Speicherplatz belegt. Es werden keine zusätzlichen Slots zugewiesen, bis Elemente hinzugefügt werden. Dieser minimale Platzbedarf macht nicht initialisierte Arrays für die verzögerte Bestückung kostengünstig.

Haftungsausschluss:info@kdj.com

Die bereitgestellten Informationen stellen keine Handelsberatung dar. kdj.com übernimmt keine Verantwortung für Investitionen, die auf der Grundlage der in diesem Artikel bereitgestellten Informationen getätigt werden. Kryptowährungen sind sehr volatil und es wird dringend empfohlen, nach gründlicher Recherche mit Vorsicht zu investieren!

Wenn Sie glauben, dass der auf dieser Website verwendete Inhalt Ihr Urheberrecht verletzt, kontaktieren Sie uns bitte umgehend (info@kdj.com) und wir werden ihn umgehend löschen.

Verwandtes Wissen

Wie führe ich eine kettenübergreifende Nachricht mit einem LayerZero-Vertrag aus?

Wie führe ich eine kettenübergreifende Nachricht mit einem LayerZero-Vertrag aus?

Jan 18,2026 at 01:19pm

Grundlegendes zur LayerZero-Architektur 1. LayerZero fungiert als leichtes, erlaubnisloses Interoperabilitätsprotokoll, das die Kommunikation zwischen...

Wie implementiert man EIP-712 für die sichere Signaturüberprüfung?

Wie implementiert man EIP-712 für die sichere Signaturüberprüfung?

Jan 20,2026 at 10:20pm

EIP-712-Übersicht und Hauptzweck 1. EIP-712 definiert einen Standard für typisiertes strukturiertes Daten-Hashing und Signieren in Ethereum-Anwendunge...

Wie kann ich mich für Airdrops qualifizieren, indem ich mit neuen Verträgen interagiere?

Wie kann ich mich für Airdrops qualifizieren, indem ich mit neuen Verträgen interagiere?

Jan 24,2026 at 09:00pm

Anforderungen an die Vertragsinteraktion verstehen 1. Die meisten Airdrop-Kampagnen erfordern eine direkte Interaktion mit Smart Contracts, die auf un...

Wie überwacht man einen Smart Contract auf Sicherheitswarnungen?

Wie überwacht man einen Smart Contract auf Sicherheitswarnungen?

Jan 21,2026 at 07:59am

On-Chain-Überwachungstools 1. Blockchain-Explorer wie Etherscan und Blockscout ermöglichen die Echtzeitprüfung von Vertragsbytecode, Transaktionsproto...

Wie kann ich einen Vertrag für automatisierte Zahlungen abschließen und finanzieren?

Wie kann ich einen Vertrag für automatisierte Zahlungen abschließen und finanzieren?

Jan 26,2026 at 08:59am

Grundlegendes zur Bereitstellung intelligenter Verträge 1. Entwickler müssen eine kompatible Blockchain-Plattform wie Ethereum, Polygon oder Arbitrum ...

Wie verwende ich OpenZeppelin-Verträge, um sichere dApps zu erstellen?

Wie verwende ich OpenZeppelin-Verträge, um sichere dApps zu erstellen?

Jan 18,2026 at 11:19am

Grundlegendes zu den OpenZeppelin-Vertragsgrundlagen 1. OpenZeppelin Contracts ist eine Bibliothek wiederverwendbarer, von der Community geprüfter Sma...

Wie führe ich eine kettenübergreifende Nachricht mit einem LayerZero-Vertrag aus?

Wie führe ich eine kettenübergreifende Nachricht mit einem LayerZero-Vertrag aus?

Jan 18,2026 at 01:19pm

Grundlegendes zur LayerZero-Architektur 1. LayerZero fungiert als leichtes, erlaubnisloses Interoperabilitätsprotokoll, das die Kommunikation zwischen...

Wie implementiert man EIP-712 für die sichere Signaturüberprüfung?

Wie implementiert man EIP-712 für die sichere Signaturüberprüfung?

Jan 20,2026 at 10:20pm

EIP-712-Übersicht und Hauptzweck 1. EIP-712 definiert einen Standard für typisiertes strukturiertes Daten-Hashing und Signieren in Ethereum-Anwendunge...

Wie kann ich mich für Airdrops qualifizieren, indem ich mit neuen Verträgen interagiere?

Wie kann ich mich für Airdrops qualifizieren, indem ich mit neuen Verträgen interagiere?

Jan 24,2026 at 09:00pm

Anforderungen an die Vertragsinteraktion verstehen 1. Die meisten Airdrop-Kampagnen erfordern eine direkte Interaktion mit Smart Contracts, die auf un...

Wie überwacht man einen Smart Contract auf Sicherheitswarnungen?

Wie überwacht man einen Smart Contract auf Sicherheitswarnungen?

Jan 21,2026 at 07:59am

On-Chain-Überwachungstools 1. Blockchain-Explorer wie Etherscan und Blockscout ermöglichen die Echtzeitprüfung von Vertragsbytecode, Transaktionsproto...

Wie kann ich einen Vertrag für automatisierte Zahlungen abschließen und finanzieren?

Wie kann ich einen Vertrag für automatisierte Zahlungen abschließen und finanzieren?

Jan 26,2026 at 08:59am

Grundlegendes zur Bereitstellung intelligenter Verträge 1. Entwickler müssen eine kompatible Blockchain-Plattform wie Ethereum, Polygon oder Arbitrum ...

Wie verwende ich OpenZeppelin-Verträge, um sichere dApps zu erstellen?

Wie verwende ich OpenZeppelin-Verträge, um sichere dApps zu erstellen?

Jan 18,2026 at 11:19am

Grundlegendes zu den OpenZeppelin-Vertragsgrundlagen 1. OpenZeppelin Contracts ist eine Bibliothek wiederverwendbarer, von der Community geprüfter Sma...

Alle Artikel ansehen

User not found or password invalid

Your input is correct