Warum wird das Löschen auf Arrays auf energie- und gasverschwendende Weise implementiert?

Wenn ich das gesamte Array (statisch/dynamisch) lösche, werden alle Elemente eines Arrays auf den Standardwert gesetzt. Wenn also ein Array eine Million Elemente hat, muss ich Gas zahlen, um Millionen Elemente auf Null zu setzen, und wahrscheinlich die Grenze von Ethereum überschreiten.

Das Löschen in der Blockchain unterscheidet sich jedoch vom Löschen in einem Speicher einer Maschine. Nichts kann jemals aus der Blockchain gelöscht werden, und daher besteht der einzige Grund, warum eine Löschoperation existieren kann, nur darin, „ein Feld zu markieren, das ungültig gemacht werden soll“, um einen intelligenten Vertragscode zu erhalten. Es gibt keinen anderen Grund. Bei Werttypen (int, float usw.) spielt es keine Rolle, ob wir die Speichervariable nur ungültig machen, indem wir sie auf Null setzen oder ihre Eigenschaft anpassen. Das Problem tritt jedoch bei Arrays auf - es gibt keinen Grund, alle Felder eines Arrays auf Null zu setzen, nur weil sie ungültig gemacht wurden. Stattdessen sollte nur das Längenattribut eines Arrays auf Null gesetzt und eine Indexprüfung für den Zugriff auf ein Array hinzugefügt werden.

Liege ich falsch?

Antworten (1)

Bei Speicherarrays ist es sinnvoll, Elemente zu löschen. Jede Speicheradresse, die von einem Wert ungleich Null auf null gesetzt wird, führt zu einer Gasrückerstattung von 15000 Gas, wodurch die Kosten anderer Vorgänge, wie z. B. das Speichern eines neuen Werts, ausgeglichen werden können.

Einzelheiten finden Sie unter Was sind die Grenzen für Gasrückerstattungen? .

In vielen Fällen haben Sie jedoch Recht, dass das Löschen von Elementen nicht kosteneffektiv ist und daher in der Praxis die meiste Zeit Daten in Smart Contracts nicht gelöscht werden.

Auch aus Sicherheitsgründen, wenn Sie etwas aus einem Array löschen, möchten Sie nicht, dass der Inhalt später auf andere Weise zugänglich ist.
@Tjaden: Ich sehe, dass die Gasrückerstattung nur sehr wenige Anreize bietet und darüber hinaus nur für einige Anwendungsfälle gilt. Ich betrachte ein Array von beispielsweise 1000 Elementen und möchte nur "das Array löschen". Aber anstatt nur für die Anpassung der Länge des Arrays (eine Speichervariable) zu bezahlen, muss ich das 1000-fache für SSTORE bezahlen, und die Rückerstattung ist für diese Kosten wirklich lächerlich. Anstatt also native Arrays zu verwenden, habe ich mehr Anreize, einen Wrapper aus effizienten Arrays zu erstellen, der auf nativen Arrays aufbaut. Das ist sehr unglücklich für mich.
Ich stimme zu, dass es sinnvoll wäre, eine separate Semantik für Lösch-/Längenreduzierung zu haben. Glauben Sie mir, dies ist bei weitem nicht der einzige Ort, an dem Solidität besser gestaltet werden könnte.
Übrigens können Sie die Länge mit 1 Montagelinie manuell auf 0 setzen, was hier möglicherweise die beste Option ist