Kurz erklärt:
Ein Storage-Slot ist eine 32 Byte (256 Bit) große Speicherzelle im persistenten Speicher eines Smart Contracts auf der Ethereum Virtual Machine. In diesen Slots wird der dauerhafte Zustand eines Contracts abgelegt, der über einzelne Transaktionen hinaus erhalten bleibt.
Einordnung und Speichermodell
Die Ethereum Virtual Machine unterscheidet mehrere Speicherbereiche: den Stapel (Stack), den flüchtigen Arbeitsspeicher (Memory) und den persistenten Speicher (Storage). Nur der Storage überdauert das Ende einer Transaktion und wird als Teil des globalen Zustands (State) im Netzwerk gespeichert. Dieser Storage ist als Schlüssel-Wert-Speicher (Key-Value-Store) organisiert: Jeder Schlüssel ist eine 256-Bit-Zahl und adressiert einen Slot, jeder Wert ist ebenfalls 256 Bit groß. Ein Contract verfügt rechnerisch über 2 hoch 256 mögliche Slots, von denen praktisch nur die tatsächlich beschriebenen belegt werden.
Speicherzuordnung (Storage Layout)
Compiler wie Solidity ordnen Zustandsvariablen fortlaufend den Slots zu, beginnend bei Slot 0. Mehrere kleine Variablen können zur Effizienz in einem einzigen Slot zusammengepackt werden (Storage Packing). Für dynamische Datenstrukturen wie mapping und array wird die Slot-Position nicht direkt vergeben, sondern über einen Keccak-256-Hash berechnet, um Kollisionen zu vermeiden. Dieses feste Zuordnungsschema wird als Storage Layout bezeichnet und ist entscheidend, wenn Contracts über Proxy-Muster aktualisierbar gestaltet werden.
Zugriff und Gaskosten
Der Zugriff auf Storage-Slots erfolgt über die Opcodes SLOAD (Lesen) und SSTORE (Schreiben). Diese Operationen zählen zu den teuersten der EVM, da der persistente Zustand von allen Netzwerkknoten dauerhaft vorgehalten werden muss. Das Beschreiben eines zuvor leeren Slots kostet mehr Gas als das Ändern eines bereits belegten Slots; das Zurücksetzen eines Slots auf null kann eine teilweise Gaserstattung auslösen. Diese Bepreisung soll den sparsamen Umgang mit Speicher fördern.
Bedeutung für Analyse und Transparenz
Der Inhalt aller Storage-Slots ist öffentlich einsehbar, auch wenn eine Variable in Solidity als private deklariert ist. Das Schlüsselwort private regelt lediglich den Zugriff durch andere Contracts, nicht die Sichtbarkeit der Rohdaten auf der Blockchain. Für die Blockchain-Analyse und forensische Untersuchungen lassen sich so Guthaben, Berechtigungen und Konfigurationswerte eines Contracts direkt aus dem Storage auslesen.
Häufige Fragen
Wie groß ist ein einzelner Storage-Slot?
Ein Storage-Slot ist genau 32 Byte beziehungsweise 256 Bit groß. Kleinere Variablen können mehrfach in einem Slot zusammengefasst werden, größere Werte belegen mehrere Slots.
Sind als private markierte Variablen wirklich geheim?
Nein. Das Solidity-Schlüsselwort private verhindert nur den Lesezugriff durch andere Contracts. Die Rohdaten im Storage-Slot sind auf der öffentlichen Blockchain für jeden einsehbar.
Warum ist Storage teurer als Memory?
Memory ist flüchtig und existiert nur während einer Transaktion. Storage bleibt dauerhaft erhalten und muss von allen Netzwerkknoten gespeichert werden, weshalb die zugehörigen Operationen mehr Gas kosten.
Wie werden Mappings auf Slots abgebildet?
Bei einem Mapping wird die Slot-Position eines Eintrags aus dem Schlüssel und der Basis-Slot-Nummer über einen Keccak-256-Hash berechnet, statt fortlaufend vergeben zu werden.
Warum ist das Storage Layout bei aktualisierbaren Contracts wichtig?
Bei Proxy-basierten Upgrades teilen sich altes und neues Logik-Contract denselben Storage. Stimmt das Layout nicht überein, können Variablen falsche Slots referenzieren, was zu fehlerhaftem Zustand führt.
Zusammenfassung
Ein Storage-Slot ist eine 32 Byte große, dauerhaft gespeicherte Speicherzelle eines Smart Contracts. In diesen Slots liegt der persistente Zustand, organisiert als Schlüssel-Wert-Speicher. Zugriffe sind gasintensiv, und alle Inhalte sind öffentlich einsehbar, auch bei als privat markierten Variablen.
Weiterführende Quellen
- Solidity-Dokumentation – Layout of State Variables in Storage: docs.soliditylang.org
- Ethereum.org – Storage in der EVM: ethereum.org