Solidity for Loop über eine riesige Datenmenge

Ich möchte eine Funktion verwenden, um alle Token eines Benutzers in Solidität zu finden, also verwende ich eine for-Schleife, um alle Token zu durchlaufen und zu prüfen, ob die Adressen übereinstimmen. Aber meine Funktion gibt bei 10 Millionen Iterationen immer null zurück, also habe ich eine Testfunktion implementiert, um zu sehen, wo die Grenzen liegen. Hat Solidität ein Problem mit riesigen for-Schleifen? Zum Beispiel habe ich die folgende Testfunktion ausprobiert, die immer 0 zurückgibt, wenn die Anzahl der Iterationen über etwa 3'000'000 liegt. Es sieht so aus, als ob es eine Zeitüberschreitung für die Ausführung einer Funktion gibt?

function testLoop(uint256 num) external view returns(uint256 res) {
        uint256 i=0;
        uint256 cnt=0;

        for(i;i<num;i++) {
            cnt++;
        }

        return cnt;
    }

Antworten (1)

Ja, die EVM hat ein Problem mit unbegrenzten Schleifen. Das verbrauchte Gas steigt mit jeder Iteration, bis es das BlockgasLimit erreicht und die Funktion überhaupt nicht ausgeführt werden kann. Folglich ist die unbegrenzte Iteration ein Antimuster .

Erwägen Sie, die Steuerung umzukehren, sodass die Clients den Vertrag zeilenweise aufrufen. Der Vertrag kann Hilfsfunktionen bereitstellen, um die Länge der Liste, den Schlüssel (zu einer Zuordnung) in einer Zeile in der Liste und die Details einer Struktur zurückzugeben, die in einer Zuordnung für einen bestimmten Schlüssel gespeichert ist.

Hier sind einige Beispielimplementierungen: Gibt es gut gelöste und einfache Speichermuster für Solidity?

Das "Mapped Struct with Index" funktioniert wie oben beschrieben.

Ich hoffe es hilft.