Tiempo estimado: 6 minutos de lectura
¿Qué es la estimación del gas consumido en un Smart Contract?
Desplegar y ejecutar transacciones sobre Smart Contracts en la blockchain conlleva un consumo medido en unidades de gas, directamente relacionadas con el tamaño del código desplegado y las operaciones ejecutadas en la EVM.
Esas unidades de gas se traducen en costes económicos ya que en cada blockchain son repercutidas a un coste dado en el token nativo.
Estimar el coste de gas consiste en calcular por adelantado (antes de interactuar con la blockchain) cuántas unidades de gas se consumirán. Puede ser muy útil para intentar efectuar optimizaciones en el código para aminorar los costes.
En mi artículo sobre la optimización de gas en Solidity se dan algunas claves para reducir el consumo de gas en el desarrollo de Smart Contracts.
Cálculo del tamaño de un Smart Contract con Hardhat
Un cálculo previo que se puede efectuar antes de desplegar un smart contract es conocer su tamaño y las unidades de gas del código de inicialización al ejecutar su constructor.
Para ello en Hardhat se puede usar el plugin «hardhat-contract-sizer«. Basta con añadirlo al proyecto, agregar su definición al archivo «hardhat.config.js» y ejecutarlo:
// Add plugin to project
yarn add --dev hardhat-contract-sizer
// Define in hardhat.config.js
require("hardhat-contract-sizer");
// Invoke command
yarn hardhat size-contracts
El resultado se mostrará por consola, distinguiendo entre el tamaño del código al desplegar y el tamaño del código de inicialización (constructor).
El plugin presenta algunas opciones de configuración (en el fichero «harhat.config.js») aunque en general los valores por defecto son adecuados. En estos ejemplos se ha definido el parámetro «unit» para medir los tamaños en kB.
Se observa que se detalla la versión de compilador usada y las posibles optimizaciones de consumo gas para balancear entre despliegue y ejecución.
En caso de exceder algún límite de tamaño permitido aparecerá un aviso:
En este ejemplo se resalta el aumento de tamaño en el código de inicialización respecto de la anterior ejecución del comando (+360.616 kB) y se alerta al haber rebasado el límite para el despliegue en la mainnet.
A este respecto existen actualmente dos límites en el despliegue de un smart contract en redes complatibles con la EVM:
- Tamaño máximo del código desplegado: 24 kB según la EIP-170.
- Tamaño máximo del código de inicialización ejecutado en el constructor: 48 kB según la EIP-3860.
Estimar el gas consumido con Hardhat
Para estimar el gas consumido con Hardhat se usa el plugin «hardhat-gas-reporter«.
Se debe añadir al proyecto, definirlo y configurarlo en el fichero «hardhat.config.js» (en el siguiente ejemplo se asume la existencia de un fichero «.env» de propiedades):
// Add plugin to project
yarn add --dev hardhat-gas-reporter
// Define in hardhat.config.js
require("hardhat-gas-reporter");
// Configure in hardhat.config.js
gasReporter: {
enabled: true,
currency: 'EUR',
coinmarketcap: `${COINMARKETCAP_APIKEY}`,
excludeContracts: [],
L1: "polygon",
L1Etherscan: `${POLYGON_SCAN_APIKEY}`,
trackGasDeltas: true,
},
El plugin permite múltiples opciones de configuración. En el ejemplo se usan las siguientes:
- enabled: activa el plugin de manera automática cuando se ejecute la tarea «hardhat test».
- currency y coinmarketcap: habilita la conversión a moneda FIAT del gas consumido en el despliegue de los smart contracts y las transacciones ejecutadas. Para ello es preciso suministrar un APIKEY válido en la plataforma de CoinMarketCap.
- L1 y L1Etherscan: define sobre qué red se quieren hacer los cálculos de coste de gas. Es necesario suministrar un APIKEY válido en el explorador de bloques apropiado para efectuar las llamadas oportunas a «eth_gasPrice» y obtener el «base gas price» instantáneo de la red.
- trackGasDeltas: si se activa, se mostrará la variación de consumo de gas entre ejecuciones consecutivas del plugin. Útil para evaluar en qué medida afectan las posibles optimizaciones de consumo de gas que se estén llevando a cabo.
Una vez habilitado el plugin se ejecuta de forma automática en las llamadas a «hardhat test». Es necesario que los test ejecutados cubran todas las transacciones que se quieran evaluar para su consumo de gas.
En caso de que el mismo método de un smart contract sea ejecutado en más de una ocasión, el plugin estimará valores mínimos, máximos y medios de consumo de gas. Esto es así porque el consumo en general no siempre será similar ya que dependerá del estado de la EVM en cada momento.
Un ejemplo de ejecución (yarn hardhat test) sería el siguiente resultado mostrado por consola:
Se observa como se distingue entre la ejecución de los distintos métodos probados en los test para cada contrato (10 llamadas al método «fillCodes» para el contrato «HashCodes») y los despliegues de los smart contracts. Para cada caso se estima el coste en unidades de gas.
En el ejemplo se resalta una disminución en el consumo de gas respecto de una ejecución anterior (-36.000 unidades de gas para el método «fillCodes»).
El valor de 28 gwei por unidad de gas (gas price) y la tasa de cambio de 0.34 eur/pol obtenidos usando las APIs definidas en la configuración del plugin se usan para calcular el coste medio en moneda FIAT.
Hay que resaltar que estos costes son estimaciones del «gas price»: cuando se efectúe realmente la transacción en la blockchain, el «gas base fee» podrá cambiar según la carga de la red. El coste además se verá incrementado para hacer frente a las propinas (tips) que percibirán los «mineros» de la blockchain en función de la prioridad deseada para la transacción.
Otras estimaciones
Si bien los cálculos del plugin «hardhat-gas-reporter» son muy útiles para conocer las unidades de gas de los métodos y el despliegue de los smart contracts, puede convenir manejar otras herramientas para a partir de esa información estimar el coste económico.
Se ofrecen a continuación algunas alternativas para conocer el precio del gas:
- Llamar al método «eth_gasPrice» a través de algún proveedor JSON-RPC para obtener el valor instantáneo del «gas base fee».
- Llamar al método «eth_maxPriorityFeePerGas» a través de algún proveedor JSON-RPC para obtener una estimación de la propina (tip) que habría que añadir al «gas base fee» para conseguir «minar» la transacción en la red. Habrá que escoger ese valor en función de la prioridad deseada.
- Recabar el «gas price» final a través de algún servicio de estimación. Es de notar que puede haber notables variaciones entre distintos proveedores. Por ejemplo se citan para Polygon varias alternativas aunque para otras redes existirán sus equivalentes:
Por otra parte, en determinadas redes el valor del «gas price» estimado puede no ser determinante. Por ejemplo en Polygon al manejarse unos costes económicos de transacción relativamente bajos, es común fijar un «gas price» mucho más elevado que el recomendado para lograr «minar» la transacción con poca demora.
Conclusión: anticipando el coste de gas de los contratos
Desplegar e interactuar con Smart Contracts en la blockchain conlleva unos costes clasificados en varios niveles:
- Consumo de gas medido como unidades computacionales para procesar las operaciones de las transacciones. En este ámbito es posible efectuar distintas optimizaciones para minimizar las unidades de gas.
- Coste económico derivado para hacer frente al uso de la infraestructura y recompensar a los «mineros».
Los costes económicos serán repercutidos a distintos actores del ecosistema web3: los desarrolladores y los equipos al frente de los proyectos en general se harán cargo de los costes durante el despliegue e inicialización de los Smart Contracts. Por otra parte los costes de las transacciones al interactuar con los contratos serán habitualmente asumidos por los usuarios de las DApps.
Para mantener los costes acotados es conveniente conocerlos de antemano. Es aquí donde herramientas como Hardhat mediante sus numerosos plugins nos permiten efectuar estimaciones para poder actuar antes del despliegue real de los contratos.
Si bien el cálculo de las unidades de gas puede ser más o menos preciso, la conversión a «gas price», el coste económico, depende de factores que no permiten efectuar más que estimaciones condicionadas al momento real de transaccionar con la blockchain y a la prioridad deseada en el tratamiento por parte de los «mineros».
¿Estás habituado a estimar los costes de gas en tus proyectos? ¿Utilizas alguna otra herramienta o pauta que te permita tomar las mejores decisiones de diseño en tus Smart Contracts? Te animo a que compartas tus experiencias.
Si necesitas un desarrollador que considere todos estos aspectos en el desarrollo de soluciones blockchain, no dudes en contactarme. ¡Muchas gracias!