Ich brauchte eine Möglichkeit, ein Speicherarray in meinem Vertrag zu löschen. Ich habe diese Antwort gesehen, aber ich habe versucht, mir einen anderen Ansatz auszudenken (meine Arrays enthalten höchstwahrscheinlich eine enorme Menge an Elementen) und bin darauf gekommen.
Ich erstelle ein leeres Speicherarray des gleichen Typs wie das Array, das ich löschen möchte. Dann weise ich dem gefüllten Array einfach ein leeres Array zu. Hier ist der Vertrag, den ich zum Testen verwendet habe.
pragma solidity ^0.4.18;
contract Test {
address[] array;
address[] helper;
function Test() public {
array.push(0x0);
array.push(0x0);
array.push(0x0);
array.push(0x0);
}
function getSize() public view returns (uint256) {
return array.length;
}
function clear() public {
array = helper;
}
}
Es funktioniert wie beabsichtigt, getSize()
gibt 0 zurück, nachdem ich aufgerufen habe clear()
.
Jetzt frage ich mich, ob es bei diesem Ansatz einige versteckte Probleme gibt, darunter so etwas wie "baumelnde Zeiger" oder erhöhte Benzinkosten.
Vielen Dank im Voraus.
Nachdem ich die Dokumentation über Typen gründlich gelesen hatte, stellte ich fest, dass der Aufruf delete
eines dynamischen Arrays den gesamten zugewiesenen Speicher freigibt.
delete a
weist den Anfangswert für den Typ zua
. Dh für Integer ist es äquivalent zua = 0
, kann aber auch auf Arrays verwendet werden, wo es ein dynamisches Array der Länge Null oder ein statisches Array der gleichen Länge mit zurückgesetzten Elementen zuweist.
Intern weist der Aufruf delete
von array es einem neuen leeren Array zu, so wie ich es getan habe.
Es ist wichtig zu beachten, dass es sich
delete a
wirklich wie eine Zuweisung an verhälta
, dh es speichert ein neues Objekt ina
.
Die Transaktionskosten sind für delete
den Aufruf niedriger als für die manuelle Zuweisung zu einem leeren Array (nicht sprechend über das Speichern dieses leeren Arrays im Speicher). In meinem Beispiel kostet das Löschen eines Arrays von 1000 Adressen durch Aufrufen 5060808delete
Gas ; Löschen des gleichen Arrays durch manuelle Zuweisung kostet 5270025 Gas.