Solidez para bucle sobre una gran cantidad de datos

Quiero usar una función para encontrar todos los tokens de un usuario en Solidity, así que uso un ciclo for para iterar sobre todos los tokens y ver si las direcciones coinciden. Pero mi función siempre devuelve cero para iteraciones de 10Mio, así que implementé una función de prueba para ver dónde están los límites. ¿La solidez tiene un problema con los bucles for enormes? Por ejemplo, probé la siguiente función de prueba, que devuelve siempre 0 si el número de iteraciones es superior a 3'000'000. ¿Parece que hay un tiempo de espera para que se ejecute una función?

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

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

        return cnt;
    }

Respuestas (1)

Sí, el EVM tiene un problema con los bucles ilimitados. El gas consumido aumenta con cada iteración hasta que llega al bloque gasLimit y la función no puede ejecutarse en absoluto. En consecuencia, la iteración ilimitada es un antipatrón .

Considere invertir el control para que los clientes llamen al contrato una fila a la vez. El contrato puede exponer funciones auxiliares para devolver la longitud de la lista, la clave (a una asignación) en una fila de la lista y los detalles de una estructura almacenada en una asignación para una clave dada.

Aquí hay algunas implementaciones de ejemplo: ¿Existen patrones de almacenamiento simples y bien resueltos para Solidity?

La "Estructura asignada con índice" funciona como se describe anteriormente.

Espero eso ayude.