Versteckte Probleme beim Ansatz "Array auf leeres Array setzen, um es zu löschen".

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.

Antworten (1)

Nachdem ich die Dokumentation über Typen gründlich gelesen hatte, stellte ich fest, dass der Aufruf deleteeines dynamischen Arrays den gesamten zugewiesenen Speicher freigibt.

delete aweist den Anfangswert für den Typ zu a. Dh für Integer ist es äquivalent zu a = 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 deletevon array es einem neuen leeren Array zu, so wie ich es getan habe.

Es ist wichtig zu beachten, dass es sich delete awirklich wie eine Zuweisung an verhält a , dh es speichert ein neues Objekt in a.

Die Transaktionskosten sind für deleteden 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.