Ich weiß nicht, ob dies eine Eigenart in der Remix-IDE ist oder etwas, das Solidity selbst tut, aber ich habe etwas Interessantes gefunden und würde gerne wissen, warum es auftritt.
Ich habe eine Struktur x in einem Vertrag Y, der zwei Felder hat:
Struct X {
address owner;
address renter;
}
Wenn ich nun die Struktur initialisiere, indem ich die Funktion createX() in der Remix-IDE aufrufe:
function createX() public {
X storage x;
x.owner = msg.sender;
}
Das Adressfeld des Mieters erhält den Wert der Vertragsadresse Y
Warum passiert das? Ich habe erwartet, dass das Feld der Nulladresse entspricht.
Der Solidity-Compiler sollte dafür eine Warnung ausgeben.
X storage x;
deklariert eine nicht initialisierte Speicherreferenz. Das heißt, x
zeigt auf Slot 0 im Speicher. Wenn Sie msg.sender
in speichern x.owner
, überschreibt es alles, was sich in Steckplatz 0 befand (die erste Zustandsvariable, die Sie deklariert haben). x.renter
, da Sie es nicht geändert haben, sollte immer noch enthalten, was auch immer Ihre zweite deklarierte Zustandsvariable war.
Gabe