Por lo que he visto, las funciones constantes y de vista cuestan gas para ejecutarse, ya que hay potencia de cómputo involucrada. Pero geth
te permitirá usar hasta 50,000 de gasolina sin preguntar. ¿Es esto correcto? ¿Metamask tiene un límite similar para sus nodos?
No estoy 100% seguro acerca de los umbrales de costos de gas para varios clientes. Tiendo a pensar que cualquier cosa al norte de cero requiere una confirmación del usuario. No sería un detalle estrictamente aplicado a nivel de protocolo.
Estoy seguro de que las funciones verdaderamente de solo lectura se pueden llamar sin la confirmación del usuario y 50,000 no es especial. Correrían sin objeciones hasta el bloque gasLimit
(alrededor de 7 millones en el momento de escribir este artículo).
Leyendo entre líneas, sospecho que tal vez haya una pequeña confusión sobre las sutilezas de las constant
funciones y el gas.
Constante, vista y pura no cuesta gasolina, pero ...
constant
Las funciones se ejecutan en el hardware del nodo local utilizando su propia copia de la cadena de bloques. Esto hace que las acciones sean inherentemente de solo lectura porque en realidad nunca se transmiten a la red.
... hay detalles.
Se requiere gas y se calcula el gas. Hay escenarios en los que importa y otros en los que no. Los escenarios en los que importa se cubren haciendo la contabilidad.
Por ejemplo, una constant
función que devuelve el gas restante después de realizar algún trabajo.
normalmente no importa
No importará en el caso de simplemente llamar a una constant
función desde un cliente. No se envía nada a la red y aunque se cuenta el gas, no hay cambio de estado. El nodo utiliza su propia CPU y su propia copia de la cadena de bloques para llegar a sus propias conclusiones. Al final, el estado no se actualiza y nada cambia en el nivel de consenso de la cadena de bloques, por lo que es como descartar los resultados.
Un caso no tan raro
Considere una cadena de funciones de contrato que llaman funciones en otros contratos. Alguien podría firmar y enviar una transacción a contract.doSomething()
. Esta es una transacción de cambio de estado que se transmite a la red. Esperamos que cueste gasolina.
Supongamos que dentro function doSomething()
hay un mensaje de solo lectura para otro contrato. otherContract.getSomething()
. Supongamos que es una constant
función. Esto no es especialmente inusual. Tal vez solo necesite leer algo de una tabla de referencia en poder de otro contrato.
En ese contexto, usar recursos "locales" significa local para la máquina que verifica la transacción. Todos deben verificar la transacción firmada... entonces... todos deben ejecutar la constant
función. Todos los mineros y nodos necesitan ejecutar la constant
función para descubrir cómo responde, de modo que puedan procesar la actualización de estado solicitada por la transacción firmada.
En ese caso, el gas que representa la constant
función es relevante. Cuando el control de flujo vuelve al contrato de llamada, la función habrá consumido algo de gas constant
y el procesamiento continuará. El costo de la constant
función aparecerá en la contabilidad final.
Para darle la vuelta y decirlo de otra manera... No podemos usar constant
para engañar a los mineros y los nodos para que hagan trabajos pesados sin pagar.
Espero eso ayude.
Merunas Grincalaítis