¿Llama una función que no cambia el estado del costo del gas de un contrato?

He leído varias veces que todo cuesta gasolina en ethereum. Pero cuando escribo y uso una función que no cambia el estado de un contrato (es decir, suma dos parámetros y devuelve la suma), eso no cuesta nada.

Entonces, ¿qué significa ahora realmente la afirmación "todo cuesta gas en ethereum"?

Respuestas (1)

Las funciones que no cambian el estado se pueden escribir explícitamente como funciones de solo lectura usando los modificadores viewy pure(anteriormente constant).

  • view: Leerá el estado pero no lo cambiará.
  • pure: No necesita acceso al estado y no lo cambiará.

Un cliente también puede invocar cualquier función utilizando el método Web3 .call().

En los tres casos se aplica lo siguiente:

  1. El contrato se ejecutará en la CPU local utilizando una copia local de la cadena de bloques (si es necesario) y no habrá verificación de red de nada.
  2. Se aplica la contabilidad de gas EVM y se realizará un seguimiento. Es decir, si la función de contrato incluye contabilidad de gas (¿cuánto queda?), entonces funcionará normalmente en un modo de "ejecución en seco", usando call(), por ejemplo. Lo mismo se aplica a las situaciones de "sin gasolina". Se debe suministrar suficiente gas con la solicitud.
  3. Como no hay verificación de red, no hay posibilidad de cambio de estado. Esto incluye el resultado de que el éter gastado para suministrar gas se devuelve efectivamente. Más precisamente, nunca se envió realmente porque la red no estaba informada.

Cada OPCODE de nivel de ensamblador tiene un costo determinado. Podría ser una generalización un poco más precisa decir que todas las operaciones de cambio de estado cuestan gasolina. Me gustaría decir que las lecturas son gratis. Al final, lo son, cuando se implementan adecuadamente. Esperemos que los detalles anteriores brinden algo de claridad sobre lo que está sucediendo.

Espero eso ayude.