-
bitcoin $77146.398531 USD
-0.23% -
ethereum $2514.088317 USD
-0.37% -
tether $0.999674 USD
0.00% -
bnb $722.500739 USD
-1.34% -
xrp $1.361192 USD
-0.23% -
usd-coin $0.999776 USD
-0.01% -
solana $101.320251 USD
-0.42% -
tron $0.339801 USD
0.16% -
hyperliquid $78.899137 USD
-0.02% -
zcash $1141.149289 USD
-0.18% -
dogecoin $0.084480 USD
-0.05% -
monero $530.834712 USD
-1.66% -
chainlink $11.453705 USD
-0.73% -
unus-sed-leo $9.056535 USD
-0.61% -
cardano $0.207439 USD
-0.31%
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.
-
PUMP Jetzt handeln$0.003757
4.91%
-
STX Jetzt handeln$0.2768
4.25%
-
PYTH Jetzt handeln$0.05480
4.20%
-
PEPE Jetzt handeln$0.0...03466
3.85%
-
BSV Jetzt handeln$17.06
3.24%
-
STABLE Jetzt handeln$0.02826
2.78%
- Cardano-Preisvorhersage, -analyse und -bewegung: Marktvolatilität und Zukunftspotenzial steuern
- 2026-09-13 16:25:01
- Datenverstoß bei Revolut: Gefälschte Regierungsanfragen nutzen Sicherheitslücken aus und legen Kundendaten offen
- 2026-09-13 09:00:02
- Blockstream, Liquid Network, Bitcoin: Streit um „gestohlene“ Gelder
- 2026-09-13 08:35:01
- Der Umlauf von Ripple RLUSD erreicht 2,4 Milliarden US-Dollar: Ein genauerer Blick auf die Entwicklung des Stablecoins
- 2026-09-13 04:50:01
- XRP-Millionärstraum: Können 10.000 XRP Sie in 20 Jahren reich machen?
- 2026-09-13 04:50:01
- Reform der Krypto-Finanzierung in Großbritannien: Ein tiefer Einblick in die 72-Millionen-Pfund-Spende und ihre Auswirkungen
- 2026-09-13 04:45:01
Verwandtes Wissen
Wie überprüft man das Futures-Volumen und das Open Interest von DOGE?
Sep 12,2026 at 08:39am
Verständnis des DOGE Futures-Volumens 1. Das Futures-Volumen bezieht sich auf die Gesamtzahl der DOGE Futures-Kontrakte, die innerhalb eines bestimmte...
Wie kann man das BTC-Futures-Volumen und das Open Interest überprüfen?
Sep 12,2026 at 03:19pm
Datenquellen für BTC-Futures-Metriken 1. CoinGlass API v4 liefert Echtzeit-Finanzierungsraten, Liquidations-Heatmaps und detaillierte Aufschlüsselunge...
Wie liest man das DOGEUSDT Perpetual Contract Chart?
Sep 11,2026 at 07:19pm
Preisbewegungen auf DOGEUSDT Perpetual Charts verstehen 1. Die Candlestick-Formation verrät die unmittelbare Marktstimmung – grüne Kerzen zeigen eine ...
Wie liest man das ETHUSDT-Futures-Chart auf Binance?
Sep 13,2026 at 05:20am
Bitcoin Halbierungsmechanik 1. Alle 210.000 Blöcke wird die Blockbelohnung für Bitcoin Miner halbiert. 2. Dieses Ereignis tritt etwa alle vier Jahre a...
Wie kann ich die Finanzierungsgebühr für BTC-Futures auf Binance überprüfen?
Sep 10,2026 at 08:00am
Auffinden der Anzeige der Förderrate 1. Navigieren Sie zur Handelsoberfläche von Binance Futures und wählen Sie den unbefristeten BTCUSDT-Kontrakt aus...
Wie kann ich den Liquidationspreis für ETHUSDT-Futures überprüfen?
Sep 13,2026 at 04:00pm
Verstehen der Liquidationsmechanismen von ETHUSDT-Futures 1. Der Liquidationspreis für ETHUSDT-Futures wird durch das Zusammenspiel von Einstiegspreis...
Wie überprüft man das Futures-Volumen und das Open Interest von DOGE?
Sep 12,2026 at 08:39am
Verständnis des DOGE Futures-Volumens 1. Das Futures-Volumen bezieht sich auf die Gesamtzahl der DOGE Futures-Kontrakte, die innerhalb eines bestimmte...
Wie kann man das BTC-Futures-Volumen und das Open Interest überprüfen?
Sep 12,2026 at 03:19pm
Datenquellen für BTC-Futures-Metriken 1. CoinGlass API v4 liefert Echtzeit-Finanzierungsraten, Liquidations-Heatmaps und detaillierte Aufschlüsselunge...
Wie liest man das DOGEUSDT Perpetual Contract Chart?
Sep 11,2026 at 07:19pm
Preisbewegungen auf DOGEUSDT Perpetual Charts verstehen 1. Die Candlestick-Formation verrät die unmittelbare Marktstimmung – grüne Kerzen zeigen eine ...
Wie liest man das ETHUSDT-Futures-Chart auf Binance?
Sep 13,2026 at 05:20am
Bitcoin Halbierungsmechanik 1. Alle 210.000 Blöcke wird die Blockbelohnung für Bitcoin Miner halbiert. 2. Dieses Ereignis tritt etwa alle vier Jahre a...
Wie kann ich die Finanzierungsgebühr für BTC-Futures auf Binance überprüfen?
Sep 10,2026 at 08:00am
Auffinden der Anzeige der Förderrate 1. Navigieren Sie zur Handelsoberfläche von Binance Futures und wählen Sie den unbefristeten BTCUSDT-Kontrakt aus...
Wie kann ich den Liquidationspreis für ETHUSDT-Futures überprüfen?
Sep 13,2026 at 04:00pm
Verstehen der Liquidationsmechanismen von ETHUSDT-Futures 1. Der Liquidationspreis für ETHUSDT-Futures wird durch das Zusammenspiel von Einstiegspreis...
Alle Artikel ansehen














