Entorno desarrollo blockchain - Hardhat
En los últimos posts, hemos estado hablando sobre dos herramientas esenciales para el desarrollo de contratos inteligentes: Remix IDE y Truffle. En ellos, hemos explorado sus características y funcionalidades.
Sin embargo, en este post, hablaremos de otra herramienta muy útil para el desarrollo de contratos inteligentes: Hardhat.
Esta herramienta ha ganado popularidad en los últimos años debido a su facilidad de uso y a la gran cantidad de características que ofrece.
En este post, exploraremos qué es Hardhat, cómo funciona y cuáles son algunas de sus características más útiles.
He creado un template en Github para que podáis iniciar desde cero cualquier proyecto con toda la configuracion.
Hardhat
Hardhat es un entorno de desarrollo para la EVM que se utiliza para compilar, probar y desplegar contratos inteligentes. Es una herramienta esencial para el desarrollo de aplicaciones descentralizadas, ya que permite a los desarrolladores automatizar el proceso de construcción y prueba de contratos inteligentes.
Con Hardhat, los desarrolladores podemos simular y ejecutar contratos inteligentes en una red local de Ethereum, lo cual nos permite identificar y corregir errores antes de desplegar el contrato en una red principal. Además proporciona una variedad de herramientas y plugins para facilitar el desarrollo de contratos inteligentes y mejorar la eficiencia del proceso de desarrollo.
Instalación
Para poder utilizar Hardhat vamos a necesitar tener instalado Node.js.
Crearemos una carpeta que será donde se encontrará el proyecto. Dentro de esa carpeta abre un terminal e inicializamos un proyecto en node e instalamos Hardhat como dependencia e inicializamos el proyecto para introducir la configuración que nosotros queramos:
npm init -y
npm install --save-dev hardhat
npx hardhat
Al ejecutar el último comando, se abrirá un asistente en el terminal que permite configurar el proyecto según nuestras preferencias. La navegación por el asistente se realiza mediante las flechas de dirección (🔼 🔽) y la tecla Enter para seleccionar la opción.
Durante el proceso, se nos pedirá que tipo de proyecto que deseamos crear (JS, TS o solo el hardhat.config.js
).
Personalmente, recomiendo seleccionar TypeScript, ya que ayuda a reducir errores al tipar las funciones.
Además, solicitará la especificación de la ruta raíz del proyecto y la opción de generar un archivo .gitignore
con las configuraciones específicas de Hardhat.
También se nos dará la opción de instalar @nomicfoundation/hardhat-toolbox
la cual incluye herramientas como ethers.js
para interactuar con los contratos, mocha y chai para realizar los tests de los contratos,
así como solcover para evaluar la cobertura de código, entre otras herramientas.
Tests
Los tests a no ser que se especifique lo contrario se realizarán en una red Ethereum local que desplegará el propio Hardhat cuando lancemos los tests, sin necesidad de configurar nada.
Para los tests como mencioné anteriormente utiliza Mocha y para interactuar con los contratos utiliza ethers.js.
Para crear un test es necesario crear un fichero dentro de la carpeta tests
.
Para ejecutar los tests nada más hay que ejecutar el comando:
npx hardhat test
Hay que tener en cuenta, que cuando ejecutamos los tests, los contratos serán compilados automáticamente si ha habido algún cambio.
Algo muy importante y a tener en cuenta cuando se realizan los tests es la cobertura de tests que tenemos. Es decir validar que los tests pasen por todas
las líneas de código y que este funcione de la manera que nosotros esperamos que funcione. Hardhat como comenté previamente ya incluye solcover
en la librería
por lo que para realizar el test nada más tenemos que ejecutar:
npx hardhat coverage
Al ejecutar el comando se realizarán todos los tests que tengamos y luego mostrará los resultados de cobertura en una tabla indicando que lineas faltan por testear:
En otros lenguajes de programación tener un 80% de cobertura es suficiente ya que hay muchas partes que no se pueden testear o son muy complicadas, en cambio, en solidity es prácticamente imperativo tener un 100% de cobertura ya que una vez que nuestro contrato está desplegado en la blockchain es inmutable (a no ser que se realicen ciertos patrones de desarrollo).
Compilar
Los contratos se desarrollados dentro de la carpeta contracts
serán compilados cuando realicemos el comando:
npx hardhat compile
Este comando compilará todos los contratos que hayan sufrido algún cambio desde la última vez que se han compilado. Esto a veces produce algún problema por lo que para forzar la compilación de todos los contratos se ejecuta el comando:
npx hardhat compile --force
Independientemente del comando que ejecutes el comando creará dos carpetas, artifacts
y typechain-types
.
En la carpeta artifacts
podremos encontrar el ABI y el bytecode que luego ejecutará la EVM de los distintos contratos que tengamos desarrollados.
En la carpeta typechain-types
tendremos los JS/TS que tendremos que importar para poder interactuar con el contrato. Esto nos facilita muchísimo
la vida ya que incluye todos los métodos y atributos que hubiéramos escrito en el contrato.
Desplegar
Ya hemos escrito un contrato, realizado los tests y ahora queremos desplegarlo en alguna red. Para ello primero tenemos que tener escrito un comando
de despliegue. Normalmente se escriben dentro de la carpeta scripts
.
En este fichero añadiremos todos los pasos necesarios para desplegar el contrato, por ejemplo si fuera un contrato con un proxy, tenemos que ordenar los despliegues
para luego asociar el contrato y demás. Este utilizará los signers que hubieras añadido en la configuración del hardhat.config
.
Para poder elegir la red en la que se ejecutará el script se le añade el parámetro --network
.
npx hardhat run ./mi/script.js --network nombre-network
Si no añadimos el parámetro network
se ejecutará en la network que tengas por defecto seleccionado en el hardhat.config
.
Conclusión
En conclusión, Hardhat es una herramienta esencial para el desarrollo de contratos inteligentes, ya que nos permite compilar, testear y desplegar contratos inteligentes de manera automatizada.
También es posible simular y ejecutar contratos inteligentes en una red local de Ethereum, lo que facilita la identificación y corrección de errores antes de desplegar el contrato en una red principal. Además proporciona una variedad de herramientas para la creación de tests, la cobertura de código y el uso de TS para añadir los tipados a los objetos.
En definitiva, es una excelente opción para los desarrolladores que buscan una herramienta fácil de usar, con una amplia gama de características y funcionalidades para el desarrollo de contratos inteligentes.