Calcule las iteraciones hasta que se alcance el límite de gas, luego vuelva a antes de alcanzar el límite de gas

Tengo un contrato haciendo muchas multiplicaciones y sumas. Algo como:

for (uint index = 0; index < 10; index++) {
      let numAdders = adders[index];
      if (numAdders > 0) {
        added = numAdders * index;
        tokens[senders] = tokens[sender] + added;
     } 
}

A) Veo que el costo del código de operación es 3 para sumar, 5 para multiplicar... así que parece que nunca corro el peligro de quedarme sin combustible para esto, ¿verdad?

B) Si el 10 en el código anterior era dinámico, ¿podría hacer que el contrato itera a través del índice hasta alcanzar el límite de gas (o algún umbral de límite de gas establecido por la persona que llama de la función pasada como parámetro) y luego confirmar todos los cambios de estado? hasta ese punto + almacenar una variable de estado para saber dónde continuar la próxima llamada de función?

Respuestas (1)

No realmente, pero puede administrar el consumo de gas y responder en consecuencia.

Su gran costo será SSTORE y, en menor medida, SREAD. Si bien los cálculos son algo triviales, leer el estado no es trivial y establecer el estado es bastante costoso.

Si no me equivoco, msg.gasle daré visibilidad al contrato sobre el gas restante. Es importante destacar que el contrato debe tener suficiente gas para realizar cualquier paso de liquidación para que todo termine antes de que se agote el gas disponible.

En general, los bucles ilimitados son un antipatrón. En lugar de introducir una complejidad no deseada en el contrato para respaldar un proceso interactivo, considere diseñar la función para manejar una iteración a la vez para que tenga un costo de gas constante en cualquier escala. Un cliente atendería la interacción y enviaría múltiples transacciones.

Hay una implicación de que necesitaría dejar el contrato en un estado válido en cada paso del camino. Eso toma un poco de tiempo para acostumbrarse.

Espero eso ayude.