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.

GitHub

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.

Wizard al ejecutar npx hardhat

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:

resultado de la cobertura que tiene nuestro código

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.