Funciones constantes y gas.

Por lo que he visto, las funciones constantes y de vista cuestan gas para ejecutarse, ya que hay potencia de cómputo involucrada. Pero gethte permitirá usar hasta 50,000 de gasolina sin preguntar. ¿Es esto correcto? ¿Metamask tiene un límite similar para sus nodos?

Respuestas (1)

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 constantfunciones y el gas.

Constante, vista y pura no cuesta gasolina, pero ...

constantLas 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 constantfunció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 constantfunció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 constantfunció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 constantfunción. Todos los mineros y nodos necesitan ejecutar la constantfunció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 constantfunción es relevante. Cuando el control de flujo vuelve al contrato de llamada, la función habrá consumido algo de gas constanty el procesamiento continuará. El costo de la constantfunción aparecerá en la contabilidad final.

Para darle la vuelta y decirlo de otra manera... No podemos usar constantpara engañar a los mineros y los nodos para que hagan trabajos pesados ​​​​sin pagar.

Espero eso ayude.

No sé cómo funciona ethereum internamente, pero según mi experiencia, cuando ejecuta funciones constantes, obtiene los datos de su nodo local y ejecuta esa función localmente, no está transmitiendo ninguna información, por lo que no cuesta nada. siempre y cuando no cambie el estado porque podría decir que una función es constante pero internamente está cambiando el estado, lo cual es incorrecto.