Kann ich durch ein Array von Strukturen filtern?

Ich möchte eine Möglichkeit, ein Array von Strukturen zu speichern. Und dann möchte ich die Möglichkeit haben, dieses Array zu filtern und eine Teilmenge von Elementen auszuwählen, in denen foo == barbeispielsweise ein bestimmter Strukturparameter benannt ist.

Ist dies in Solidität möglich? Gibt es Einschränkungen hinsichtlich der Größe meines ursprünglichen Arrays und der Anzahl der zurückgegebenen Artikel?

Schließlich, weil dies nur aus dem Hauptbuch gelesen würde, sollte es kein Benzin kosten, richtig auszuführen?

Vielen Dank.

Antworten (2)

Wie ich verstehe, ist es mit Folgendem möglich,

Gibt es Einschränkungen, wie groß mein ursprüngliches Array ist?

Die Beschränkung auf die Speicherung von Verträgen ist auch die Beschränkung dafür - dh 2^261 Bytes. Sie können diese Frage zur Beschränkung der Vertragsspeicherung weiterleiten.

Anzahl der zurückgegebenen Artikel?

Es gibt zwei Einschränkungen; welche Solidität es erlaubt hat, von einer Funktion zurückzukehren, die hier gut gelesen wird, und was Ihr Client-Computer zur Verbindung mit dem Ethereum-Netzwerk in seinem Speicher verarbeiten kann.

Da dies nur aus dem Hauptbuch gelesen würde, sollte es kein Gas kosten, es korrekt auszuführen

Dies hängt von Ihrer Anforderung ab. Wenn Sie nur lesen möchten, ohne dass eine Transaktion involviert ist (lokal anzeigen oder so), kostet es kein Benzin. Aber obwohl die Funktion konstant ist, wenn Sie sie innerhalb einer Transaktion verwenden müssen (sagen wir, Sie rufen eine nicht konstante Funktion auf und innerhalb dieser Funktion verwenden Sie diese konstante Funktion, um etwas zu überprüfen), kann dies immer noch Benzin kosten. Eine gute Lektüre dazu finden Sie in dieser Frage .

Code würde so ähnlich aussehen, je nach Ihren Anforderungen kann er sich ändern

MyStruct[] myStructArray;

function checkArray() constant returns(bool[]){ // change on what you need to return

    bool[] checker; // change on what you need to return

    for(uint i = 0; i<myStructArray.length; i++){
        if(myStructArray[i].foo == bar){
            checker[i]=true; //or whatever you want to do if it matches
        }
        else{
            checker[i]=false;
        }
    }
    return checker;
}
Vielen Dank für Ihre Antwort. Könnten Sie mir ein Beispiel-Code-Snippet geben, um das eigentliche „Filter“-Verfahren durchzuführen?
ah verstehe, danke. Ich habe Ihre Antwort akzeptiert, da sie alle meine Punkte trifft und sie gut erklärt. Danke Freund =)

All dies ist möglich, aber es gibt natürlich Einschränkungen. Wie groß Ihr Array sein kann, hängt davon ab, was Ihre Struktur enthält. Ich kann nicht sagen, wie viele Elemente Sie genau halten können, aber offensichtlich verbraucht eine Struktur mit 10 Zeichenfolgen weit mehr Gas zum Manipulieren als eine Struktur mit beispielsweise 2 uint8.

Abhängig von Ihren Anwendungsfällen möchten Sie möglicherweise auch, dass der Vertrag das gesamte Array zurückgibt und die Filterung clientseitig durchführt. Es hängt wirklich davon ab, was Sie erreichen möchten und wie groß / schwierig das Filtern Ihrer Daten ist.

Beim Auslesen von Daten sind Sie weiterhin auf den Gasbedarf beschränkt, aber der Benutzer zahlt nicht dafür. Selbst wenn Sie nicht für das Gas bezahlen, können Sie also kein Array mit Millionen von Strukturen zurückgeben, da dem Funktionsaufruf das Gas ausgeht.