¿Cómo estimar correctamente los costos de gas de las llamadas de funciones con go-ethereum y golang?

Estoy intentando construir un programa en golang para modelar los costos de gas ethereum de las llamadas de función para los contratos inteligentes que escribo. Pude estimarlos con éxito usando, ethclient.EstimateGassin embargo, los costos de gas informados parecen increíblemente bajos, en cualquier lugar, desde 22K-> 24K de gas para enviar tokens, y alterar algunas variables booleanas en el almacenamiento. No hay forma de que ese sea el costo correcto del gas. No puedo averiguar cómo los sitios web como ethgasstation pueden estimar de manera confiable los costos de la gasolina, si los costos informados por la biblioteca go-ethereum apenas coinciden con los costos del mundo real.

Respuestas (1)

No puedo decirte por qué ethclient.EstimateGassub-reporta el gas consumido. Recuerdo haber enfrentado el mismo problema una vez y mi solución perezosa fue multiplicar lo que informara por 3.

Para calcular el precio del gas correcto para una llamada de método, necesita el código EVM binario del contrato. Una vez que tenga eso, puede buscar el precio de cada instrucción en el Libro Amarillo en el Apéndice G y H. Sin embargo, la parte difícil de este cálculo es que el costo exacto del gas dependerá del estado de la máquina virtual que ejecuta el código (el EVM). Para calcular eso correctamente, probablemente necesite simular toda la máquina virtual. Y en el caso general, toda la cadena de bloques de Ethereum, es decir, necesita un nodo de cadena de bloques de Ethereum.

Si, por ejemplo, llama a la función ERC20 transfer, terminará pagando al menos 21 000 de gasolina solo para hacer la llamada de función y entre 10 000 y 40 000 para actualizar los saldos y 400 para leer los saldos más gasolina adicional para pagar la lógica de la tabla de salto en el comienzo del contrato. El monto a pagar para actualizar cada saldo (remitente y receptor) dependerá de si la dirección tiene saldo o no (5.000 gas vs. 20.000 gas por cada actualización) por lo que es necesario conocer todo el estado de la máquina virtual. En otros casos, necesitaría conocer el estado de otras cuentas de Ethereum, como saldos o contratos inteligentes implementados.

¿Hay alguna forma de evitar eso? Parece que ethclient.EstimateGasestima el gas solo para hacer la llamada de función. Esto parece muy mal diseñado no? ¿La única forma de estimar el costo es literalmente hacer girar o emular la máquina virtual? Tiene que haber una mejor manera de hacer esto.
No creo que haya una forma de evitar esto; necesita simular toda la cadena de bloques (no solo la máquina virtual) para calcular el gas consumido para una transacción arbitraria.
Tienes razón, ahora me he encontrado con problemas para simular la cadena de bloques. ¡Gracias!
Creo que este problema está relacionado con el problema de la detención.
Ok gracias voy a hurgar. Agradezco la ayuda :)