Hay muchas preguntas y respuestas acerca de la estimación de la cantidad de gas consumido. Esta pregunta es sobre qué hacer con esta estimación.
¿Qué valores deberíamos proporcionar realmente a gas
y gasPrice
en las send()
opciones, para asegurarnos de que las transacciones se realicen, pero no pagaremos demasiado?
myContract.methods.myMethod(123).send({
from: myAddress,
gas: myGasLimit,
gasPrice: myGasPrice
}, function(error, transactionHash){
...
});
La mayoría de la gente parece aconsejar establecer la gas
opción en un 10-20% por encima estimatedGas
(que se puede recuperar a través de la interfaz web3).
Pero, ¿qué ocurre en el caso de que la estimación sea incorrecta ? Debido a que se devuelve el gas no utilizado, ¿por qué no establecer el máximo en algo enorme? ¿Qué pasa con el gasPrice
, deberíamos dejar eso en manos del minero o establecer un valor?
Hasta ahora, no proporcioné ningún valor para gas
y gasPrice
en las opciones de envío, y eso resultó en cantidades muy variables de gasolina realmente pagada entre billeteras. En el navegador con MetaMask, la implementación de un contrato cuesta 0,000633134 Ether (en Rinkeby) y la misma implementación en CoinbaseWallet cuesta 0,01268828 Ether (también en Rinkeby). Aparentemente, la gasPrice
transacción de CoinbaseWallet fue de 20 GWei en comparación con 1 GWei para la transacción de MetaMask.
Editar: aclaración de esta pregunta:
Para que mi pregunta quede más clara: donde la pregunta a la que me vinculo anteriormente es sobre las limitaciones de la función getEstimate, estoy aquí preguntando sobre las mejores prácticas después de haber usado esta función para obtener una estimación.
Teniendo una estimación, ¿qué valores proporciono para los campos gas
y gasPrice
para limitar el riesgo de pagar demasiado y ser recogido en el primer bloque siguiente?
Supongamos aquí que el método es nuestro y sabemos que la estimación es más o menos correcta (no son posibles cambios de estado que hagan que el consumo de gas sea sustancialmente mayor).
De las respuestas actuales, puedo concluir: no establezca el límite de gas demasiado alto (¿entonces la regla del 10-20% más alta que la estimación suena bien?)
Acerca de gasPrice
: Hice algunos experimentos y vi que MetaMask usa el valor que establece dapp y CoinBaseWallet lo ignora. Entonces, ¿tal vez dejar que la billetera (y si es posible el usuario final) decida es el camino a seguir?
Ventajas y desventajas de establecer un límite alto en gas
:
out of gas
evento, todo el gas se perderá: cuando se queda sin gas, la transacción falla, pero el éter gastado en gas no se devuelve.Pros y contras de establecer (disposición a pagar) un alto gasPrice
:
Entonces, para el límite de gas, desea tener una buena estimación basada en los parámetros reales de la transacción y el estado actual de almacenamiento al que accede y usa su transacción, y de hecho agregar un poco de margen para tener en cuenta el cambio de estado entre dicha estimación y la ejecución real de la transacción, ya que no desea quedarse sin gasolina (y, por lo tanto, gastar toda la gasolina en una transacción fallida) debido a un ligero aumento allí.
En cuanto al precio del gas, idealmente dejaría que el usuario final elija, en función de los promedios actuales del precio del gas para transacciones "rápidas" (siguiente bloque), transacciones "promedio" (¿en un minuto?) y "baratas". actas. Para estos promedios móviles, puede consultar ETH Gas Station .
Coinbase Wallet parece fijar el precio de la gasolina en 20 GWei, que es bastante alto. Está bien al transferir Ether o comprar un Token, pero al llamar a algunas funciones de un contrato, el costo de la transacción puede ser prohibitivo. Las billeteras deberían dar a su usuario la opción de establecer el precio del combustible, con un buen UX asociado.
Creo que este es un tema importante.
La razón para no poner grandes cantidades es que la transacción puede revertirse y, en algunos casos, consumir todo su gas.
Además, la estimación cambiará si la función depende del tiempo de alguna manera, lo que significa que el código a ejecutar depende de las instrucciones anteriores. Dicho esto, si conoce la función que está ejecutando, puede determinar si es conveniente o no dejar que el nodo decida el gas necesario.
Espero que esto ayude
ismael