Ist das Entfernen von Elementen aus Arrays in Solidität möglich?

Angenommen a struct Nodeund ein Array von Nodes allNodes[]. Ich war erfolgreich beim Hinzufügen Nodezum Array, aber als ich versuchte, eine removeNode()Methode zu verwenden (die die deleteMethode in Arrays verwendet), bleibt der Wert von allNodes.lengthgleich. Liegt es daran, dass Blockchains „unveränderlich“ sind? Bedeutet unveränderlich nicht, dass eine Transaktion (sogar remove Node()) nicht rückgängig gemacht werden kann?

delete@RichardHorrocks Ich habe bereits erwähnt, dass ich Methode verwende . Das Problem hier ist, wenn ich meine manuell verschiebe Nodes, wenn ich das nächste Mal versuche, ein Element mit der pushMethode hinzuzufügen, wird es einen Konflikt geben ... weil das letzte Element in der manuellen Methode unverändert bleibt.
Delete reorganisiert das Array nicht oder ändert die Länge nicht wie erwartet. Einige Ideen zur Vertragsgestaltung hier: ethereum.stackexchange.com/questions/13167/…

Antworten (1)

Es ist möglich, aber es macht nicht genau das, was Sie (wahrscheinlich) erwarten.

Es signalisiert "keine wichtigen Daten hier" und hilft, die Dinge auf Plattformebene effizient zu halten, aber es reorganisiert das Array nicht auf Anwendungsebene, was bedeutet, dass es nicht alle Elemente über der gelöschten Zeile um eine Zeile nach unten verschiebt. Länge ändert sich nicht.

Unveränderlichkeit wirkt sich hier aus. Egal was wir tun, wir hängen nur an den vorherigen Zustand an. Nichts wird wirklich gelöscht. Sogar die Transaktionen, die die "Zeile" erstellt, aktualisiert und schließlich gelöscht haben, sind Teil der unveränderlichen Historie. Beim „Löschen“ kann es nicht darum gehen, Daten zu löschen, aber es könnte darum gehen, sie neu zu organisieren.

Schau mal hier vorbei: Gibt es gut gelöste und einfache Speichermuster für Solidity?

„Mapped Structs with Delete-enabled Index“ führt eine logische Löschung durch. Dies ist für Situationen geeignet, in denen ein hoher Prozentsatz von Zeilen gelöscht wird und Sie eine Schleife über Garbage vermeiden möchten.

Gebräuchlicher ist das viel einfachere „Mapping with Struct“. Es setzt ein "Bit", um ein logisches Löschen anzuzeigen.

Ich hoffe es hilft.

Danke, Sir .... aber ist es legal, die allNodes.lengthVariable manuell zu erhöhen / zu verringern? Wie allNodes.length ++oder allNodes.length --...
Ja. Vielleicht wird jemand Gewissheit über alle Randfälle um ++ geben. Ich habe es nicht oft genug benutzt, um sicher zu sein, und ich möchte Sie nicht in die Irre führen. Wahrscheinlich Geschmackssache - ich push() gerne, weil es keinen Zweifel daran lässt, was in der neuen Zeile steht.