Zugehörigkeit zu einer Reihe von Zeichenfolgen

Ich suche solide Hilfe beim Speichern einer Reihe von Zeichenfolgen und beim Überprüfen der Mitgliedschaft in dieser Menge. Dazu habe ich eine konkrete und eine abstrakte Frage:

Beton

Was ist die Datenstruktur in Solidity, die mir einen (möglicherweise nur anhängenden) Satz gibt, den ich auf Mitgliedschaft abfragen kann? z. B. suche ich speziell nach etwas wie:

myset = ["a", "b", "c"] # registers my set on-chain
"d" in myset            # return True or False

Gibt es außerdem bessere oder schlechtere Möglichkeiten, diese Datenstruktur ohne viel Datenduplizierung zu verwenden?

Ändert sich die Antwort, wenn myseteine Million Mitglieder lang sind?

Abstrakt

Wie wird so etwas unter der Haube umgesetzt? Das Testen des Lesezugriffs für die Mitgliedschaft scheint möglich, aber da Ketten unveränderlich sind, wie würde eine solche Liste praktisch aktualisiert werden?

Antworten (1)

A mappingist alles, was Sie brauchen:

pragma solidity ^0.4.25;

contract Test { 
    mapping(string => bool) seen;

    function add(string foo) external {
        seen[foo] = true;
    }

    function alreadySeen(string foo) external view returns (bool) {
        return seen[foo];
    }
}

Die Vertragsspeicherung ist änderbar. Die Blockchain als „unveränderlich“ zu bezeichnen, ist vielleicht irreführend … ein besserer Begriff könnte „nur anhängen“ sein. Indem Sie neue Transaktionen an einen Smart Contract senden, können Sie an die Blockchain anhängen, und der Status im letzten Block kann sich von dem Status in vorherigen Blöcken unterscheiden. Alle alten Blöcke sind also immer noch vorhanden und unveränderlich, aber der aktuelle Zustand Ihres Smart-Contract-Speichers kann sich im Laufe der Zeit ändern (weil „aktuell“ den neuesten Block bedeutet).

Beachten Sie, dass die Schlüssel von a mappingnicht aufgezählt werden können. Wenn Sie die Werte aufzählen müssen, die Sie Ihrem Set hinzugefügt haben, habe ich einen Blogbeitrag über aufzählbare Sets, der helfen sollte: https://programtheblockchain.com/posts/2018/06/03/storage-patterns-set/ .