Ethereum Solidity: Memory vs Storage & Wie initialisiere ich ein Array innerhalb einer Struktur?

Im Loom Network-Telegramm (mit ca. 8.000 Mitgliedern!) Stellen Leute Fragen zu verschiedenen Themen, wie z. B. zur Loom-Roadmap, zur theoretischen Blockchain und zu Fragen zum Ethereum sowie zur Fehlerbehebung bei Solidity.

Es wurde eine spezielle Frage gestellt, die das Initialisieren eines Arrays innerhalb einer Struktur betraf. Die Person, die es gefragt hat, hat dann ihren Code angegeben und sich gefragt, warum es nicht funktioniert. Ich konnte mir keine Antwort aus der Luft vorstellen, also beschloss ich, in einem Beitrag kurz auf dieses Thema einzugehen.

Der nicht funktionierende Code ist unten zu finden. Ich empfehle Ihnen, selbst eine Lösung zu finden (Sie haben die ganze Zeit über mit CryptoZombies geübt, oder?).

Lesen Sie weiter, um die Antwort zu finden.

Es sollte beachtet werden, dass in der obigen Geige der Schlüsselwortspeicher benötigt wird, wenn der variable Raum deklariert wird. Wenn es als Room room deklariert wurde, gab der Compiler den folgenden Fehler zurück:

TypeError: Der Typ struct StructArrayInitWrong.Room-Speicher kann nicht implizit in den erwarteten Typ struct StructArrayInitWrong.Room-Speicherzeiger konvertiert werden.

Eine Theorie

Die Speichervariablen eines Vertrags definieren den Status Ihres Vertrags und werden nur durch sendTransaction-Aufrufe [1] geändert.

Speichervariablen sind temporäre Variablen, die nur innerhalb der aufrufenden Funktion existieren (sie können nicht außerhalb von einer deklariert werden). Sie werden nach dem Beenden der Funktion gelöscht und sind in der Regel billiger als Speichervariablen - mehr Details zu den Gaskosten hier.

Lassen Sie uns ein Beispiel durchgehen, um zu verstehen, wie eine Speichervariable in einer Funktion verwendet werden kann, um den Status eines Vertrags zu beeinflussen.

In der folgenden Geige wird eine Kopie von x in g () übergeben, da die Zustandsvariable x nach der Ausführung unverändert bleibt (daher verwenden wir das pure-Schlüsselwort).

Andererseits wird y in h () als Speicher deklariert, was bedeutet, dass x als Referenz übergeben wird. Infolgedessen wird die Statusvariable x nach dem Aufruf von h () geändert.

Sie können das Ergebnis testen, indem Sie f () aufrufen und dann den Wert von y [2] überprüfen. Obwohl g () nach h () aufgerufen wird, ändert es den Wert der Statusvariablen nicht.

Genug theoretisiert, kommen wir zur Antwort auf die ursprüngliche Frage.

Da wir das Players-Array beim Initialisieren der Struktur nicht initialisieren können, müssen wir dies in Schritten tun:

  1. Initialisieren Sie die Raumstruktur mit einem leeren Player-Array auf die Standardwerte - wie hier und in dieser Geige beschrieben.
  2. Schieben Sie den Raum zum Raumarray.
  3. Schieben Sie msg.sender zum Player-Array des letzten Raums (rooms.length-1 bezieht sich immer auf das letzte Element in einem Array).

Arbeitscode Fiddle unten:

Der Trick dabei ist, dass die neue Adresse [] (0) Speicher für ein leeres Array von Adressen reserviert. Nach der Initialisierung wird der Raum zu Räumen hinzugefügt und ist nun Teil einer Speichervariablen. Dies ermöglicht es uns, auf den Array-Playern zu operieren und Werte dorthin zu übertragen.

Hinweis: Wenn wir ein neues uint [] (8) erstellen würden, würden wir ein Array von 8 Nullen erhalten. Sie können es in dieser Geige testen.

Wir hoffen, dass wir für heute einige Missverständnisse in Bezug auf Speicher / Speicher und deren Verwendung in Ihren Funktionen ausgeräumt haben. Teilen Sie uns Ihre Fragen in unserem Telegrammkanal mit. Wenn diese nicht in wenigen Nachrichten beantwortet werden können, widmen wir einen Beitrag (oder vielleicht eine CryptoZombies-Lektion!).

Loom Network ist die Blockchain-Plattform der Wahl für seriöse Dapp-Entwickler - der Universal Layer 2, der Entwicklern die Tools zur Verfügung stellt, die sie benötigen, um funktionierende benutzerbezogene Dapps zu erstellen.

Neu bei Loom? Fang hier an.

Möchten Sie Ihre LOOM-Token einsetzen und dabei helfen, das Loom-Netzwerk zu sichern? Finde heraus wie.

Und wenn Ihnen dieser Artikel gefallen hat und Sie auf dem Laufenden bleiben möchten, melden Sie sich für unsere private Mailingliste an.