Smart Contract - Alle Strukturinhalte anzeigen / zurückgeben

Ich habe einen Smart Contract geschrieben, der eine Datei-ID zusammen mit ihrer Beschreibung speichert.

struct AllFiles
 {

    string fileDesc;        //Description of a file
    uint fileId;            //Corresponding file ID
}

Dies wird auf einen uint-Wert abgebildet, der hier im Grunde der Datei-ID entspricht, as

Zuordnung (uint =>AllFiles) public allFiles;

Ich möchte den gesamten Inhalt dieser Zuordnung zurückgeben, so wie wir das gesamte Strukturarray in OOP zurückgeben. Gibt es eine Möglichkeit, dies in Solidity zu tun? Ich habe es irgendwo vor langer Zeit gelesen (kann die Ressource jetzt nicht finden), dass Arrays nicht zurückgegeben werden können. Aber da dies ein Mapping ist, frage ich mich, ob es möglich ist.

Antworten (2)

Mappings sind nicht iterierbar. siehe: Dokumentation zum Zuordnungstyp, aber Sie können die Iteration darauf aufbauen, zum Beispiel: iterable_mapping.sol (was eine gute Inspiration ist)

Wenn Ihr uint-Schlüssel zuverlässig inkrementiert wird, können Sie so etwas wie a speichern filesCountund das in a für Iterationen verwenden. etwas wie (Pseudocode):

contract Files {
    struct AllFiles{
        string fileDesc;        //Description of a file
        uint fileId;            //Corresponding file ID
    }
    uint filesCount;

    mapping (uint =>AllFiles) public allFiles;

    function addFile(string _desc) {
        uint id = filesCount+1;
        allFiles[id] = AllFiles({fileDesc: _desc, fileId: id});
    }

    function iterate() {
        for(uint256 i = 1; i<=filesCount; i++) {
            allFiles[i];
        }

    }
}

Oder Sie behalten ein Array mit den IDs und iterieren ähnlich über dieses.

Ich hoffe, das hilft

@bumi sagt einige nützliche Dinge über Mappings. Die forSchleife springt als Anti-Pattern heraus, da dies nicht mehr funktioniert, wenn zu viele Dateien vorhanden sind.

Sie können eine skalierbare Lösung erstellen, indem Sie die Iteration an Clients weitergeben. Die Kunden fragen nacheinander nach Zeilen, damit jeder Aufruf zum Vertrag die gleichen Gaskosten hat. Einige Ideen hier: Gibt es gut gelöste und einfache Speichermuster für Solidity?

Ich hoffe es hilft.