Wie belegen Abbildungen in Solidität Speicher?

Angenommen, ich deklariere eine Zuordnung, die uint256-Zahlen als Schlüssel verwendet und sie einem einzelnen 8-Bit-Zeichen zuordnet. Ich füge dieser Zuordnung 5 Mitglieder hinzu.

Offensichtlich kann ich dann auf jedes dieser 5 Zeichen zugreifen, indem ich ihre jeweiligen Indizes verwende.

Was ich also wissen möchte, ist, verbraucht diese Zuordnung 5 * 8 = 40 Bit Speicher oder 5 * 8 + 5 * 256 = 1320 Bit?

Antworten (1)

Ein Mapping ist ein dynamischer Typ, der als Speicher- (nicht Arbeitsspeicher-) Schlüsselwertdatenbank fungiert

Nehmen wir das folgende Beispiel

contract C {
    mapping(uint256 => uint256) items;
    function C() {
      items[0xC0FEFE] = 0x42;
    }
}

Der Assemblercode für die C-Funktion enthält:

  // Storing 0x42 to the address 0x798...187c
  0x42
  0x79826054ee948a209ff4a6c9064d7398508d2c1909a392f899d301c6d232187c
  sstore

Das heißt, wir speichern den Wert 0x42in dem Wert, der dem Schlüssel entspricht, 0x79826054ee948a209ff4a6c9064d7398508d2c1909a392f899d301c6d232187cder der Hash des Zuordnungsschlüssels ist0xC0FEFE

Hier ist eine interessante Diskussion darüber, warum Zuordnungen nicht für die Speichernutzung entworfen werden können. Warum (konzeptionell) können Zuordnungen keine lokalen Variablen sein?

Bedeutet das effektiv, dass die Indizes keinen Speicher belegen, da sie nur verwendet werden, um dem Wert eine Speicheradresse zuzuweisen? Tut mir leid, wenn es dumm klingt (ich bin ziemlich neu bei Ethereum), aber bedeutet das, dass das in der Frage erwähnte Beispiel tatsächlich nur 40 Bit Speicher verbraucht?
1-ja 2-in diesem Beispiel speichern wir nur 1 Byte
Ist nicht der Wert 0x000000000000000000000000000000000000000000000000000000000000000000000000042 gespeichert, da Slots 32 Bytes sind?
Genau jeder Wert ist 32 Byte breit. aber zunächst ist es nur ein 1 Byte. es ist wie das Speichern von 1 Byte in einem Array mit einer Größe von 32 Byte (in meinem Kommentar habe ich über die Größe im Einstiegspunkt gesprochen)