-
bitcoin $76809.786636 USD
-1.48% -
ethereum $2255.013135 USD
-1.06% -
tether $0.998331 USD
-0.03% -
bnb $692.945952 USD
-2.00% -
xrp $1.253024 USD
0.33% -
usd-coin $0.999680 USD
0.01% -
solana $92.085048 USD
-2.26% -
tron $0.320675 USD
1.75% -
hyperliquid $83.729800 USD
-2.23% -
zcash $1138.211301 USD
-10.02% -
monero $625.310942 USD
2.97% -
dogecoin $0.073998 USD
-1.60% -
unus-sed-leo $9.293910 USD
-1.10% -
chainlink $11.118351 USD
-1.69% -
cardano $0.187432 USD
-1.61%
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.
-
PIEVERSE Jetzt handeln$1.15
10.64%
-
ZRO Jetzt handeln$1.86
8.56%
-
PUMP Jetzt handeln$0.004253
7.66%
-
LIT Jetzt handeln$3.32
7.51%
-
VVV Jetzt handeln$22.62
6.18%
-
NIGHT Jetzt handeln$0.04218
5.43%
- US Midterms, Prognosemärkte und Krypto-Wettbewerbe: Eine riskante Wette auf die Zukunft Washingtons
- 2026-11-04 04:30:22
- Digitale Vermögenswerte, globale Finanzen und KI: Navigieren durch die nächste Grenze bei DavosWeb3 und darüber hinaus
- 2026-11-04 04:30:22
- Avalanche AVAX-Preis sinkt aufgrund allgemeiner Marktprobleme; Das institutionelle Interesse bleibt groß
- 2026-11-03 12:35:02
- Warum ist der Mengenpreis gesunken? Ein tiefer Einblick in den jüngsten Rückgang von QNT inmitten der Marktunruhe
- 2026-11-03 12:55:01
- XRP-Preisdiagrammanalyse von Eggag Crypto: Sind Sie bereit für die „größte Welle 3“?
- 2026-11-03 01:15:01
- Die Muttergesellschaft von Bed Bath & Beyond unterstützt den 350-Millionen-Dollar-SPAC-Deal von tZERO: Was New Yorker wissen müssen
- 2026-11-03 01:15:01
Verwandtes Wissen
So berechnen Sie die Gesamtkosten für das Halten einer BTCUSDT-Futures-Position
Oct 26,2026 at 04:06am
Gesamtkostenkomponenten für BTCUSDT-Futures-Positionen 1. Die Gesamtkosten für das Halten einer BTCUSDT-Futures-Position umfassen sowohl explizite als...
So überwachen Sie die XRPUSDT-Finanzierungsraten und das offene Interesse gemeinsam
Oct 20,2026 at 06:39pm
Mechanik der Finanzierungsrate bei unbefristeten XRPUSDT-Verträgen 1. Die Finanzierungsraten für XRPUSDT Perpetual Swaps werden alle acht Stunden anha...
So legen Sie einen Break-Even-Stop-Loss für SOLUSDT Perpetual Futures fest
Oct 23,2026 at 09:34am
Verständnis der Break-Even-Stop-Loss-Mechanik 1. Ein Break-Even-Stop-Loss ist eine dynamische Order, die sich nach oben anpasst, wenn sich die Positio...
So verwenden Sie den Binance-Futures-Rechner für ETHUSDT-Trades
Oct 21,2026 at 02:00am
Verstehen der Schnittstelle des Binance-Futures-Rechners 1. Der Rechner ist direkt in die Binance-Futures-Handelsschnittstelle eingebettet und über di...
So überprüfen Sie den BTCUSDT-Markpreis vor einer Futures-Liquidation
Oct 26,2026 at 12:20pm
Markpreis in BTCUSDT-Futures verstehen 1. Der Markpreis ist ein berechneter Wert, der von Börsen verwendet wird, um unfaire Liquidationen bei volatile...
So passen Sie die Hebelwirkung eines unbefristeten TRUMPUSDT-Vertrags an
Oct 30,2026 at 10:19pm
Grundlegendes zur Mechanik des unbefristeten Vertrags von TRUMPUSDT 1. TRUMPUSDT ist ein thematischer, unbefristeter Terminkontrakt, der an mehreren T...
So berechnen Sie die Gesamtkosten für das Halten einer BTCUSDT-Futures-Position
Oct 26,2026 at 04:06am
Gesamtkostenkomponenten für BTCUSDT-Futures-Positionen 1. Die Gesamtkosten für das Halten einer BTCUSDT-Futures-Position umfassen sowohl explizite als...
So überwachen Sie die XRPUSDT-Finanzierungsraten und das offene Interesse gemeinsam
Oct 20,2026 at 06:39pm
Mechanik der Finanzierungsrate bei unbefristeten XRPUSDT-Verträgen 1. Die Finanzierungsraten für XRPUSDT Perpetual Swaps werden alle acht Stunden anha...
So legen Sie einen Break-Even-Stop-Loss für SOLUSDT Perpetual Futures fest
Oct 23,2026 at 09:34am
Verständnis der Break-Even-Stop-Loss-Mechanik 1. Ein Break-Even-Stop-Loss ist eine dynamische Order, die sich nach oben anpasst, wenn sich die Positio...
So verwenden Sie den Binance-Futures-Rechner für ETHUSDT-Trades
Oct 21,2026 at 02:00am
Verstehen der Schnittstelle des Binance-Futures-Rechners 1. Der Rechner ist direkt in die Binance-Futures-Handelsschnittstelle eingebettet und über di...
So überprüfen Sie den BTCUSDT-Markpreis vor einer Futures-Liquidation
Oct 26,2026 at 12:20pm
Markpreis in BTCUSDT-Futures verstehen 1. Der Markpreis ist ein berechneter Wert, der von Börsen verwendet wird, um unfaire Liquidationen bei volatile...
So passen Sie die Hebelwirkung eines unbefristeten TRUMPUSDT-Vertrags an
Oct 30,2026 at 10:19pm
Grundlegendes zur Mechanik des unbefristeten Vertrags von TRUMPUSDT 1. TRUMPUSDT ist ein thematischer, unbefristeter Terminkontrakt, der an mehreren T...
Alle Artikel ansehen














