Tiempo estimado: 5 minutos de lectura

Hardhat permite de manera sencilla interactuar con los Smart Contracts desarrollados mediante su consola interactiva javascript y la ejecución de ficheros de scripts.

¿Cómo usar la consola con Hardhat?

Hardhat proporciona el acceso a una consola javascript sobre la que poder interactuar con los smart contracts desarrollados. Se ejecuta de este modo:

yarn hardhat console

Si es necesario, los contratos serán compilados de forma automática antes de dar paso a la consola. Para prevenir la compilación se debe usar el modificador «–no-compile»:

yarn hardhat console --no-compile

El entorno de ejecución de la consola, una vez se carga el fichero de configuración «hardhat.config.js», es similar al de las tareas, tests y scripts, el Hardhat Runtime Environment. Por tanto se cuenta con todas las utilidades necesarias para leer y escribir en la Hardhat Network.

Como la interacción con la blockchain consiste en operaciones por naturaleza de carácter asínicronas, la consola de Hardhat permite el uso de la palabra reservada en javascript «await».

Para salir de la consola basta ejecutar dos veces consecutivas «ctrl-c».

Otra posibilidad de ejecución consistiría en interactuar desde la consola con la Hardhat Network en modo proceso:

yarn hardhat node
yarn hardhat console --network localhost

En caso de cambiar algún parámetro de configuración del fichero «hardhat.config.js» habría que reiniciar ambos procesos.

¿Para qué se usa la consola de Hardhat?

Un uso común de la consola de Hardhat es poder probar de forma sencilla las funciones desarrolladas en un Smart Contract.

Se ilustra con el siguiente contrato de ejemplo:

pragma solidity ^0.8.20;

import "@openzeppelin/contracts/access/Ownable.sol";

contract TestingContract is Ownable {  
    
	/// @dev Emitted when currentValue is updated
    event ValueUpdated(uint256 indexed newValue, uint256 indexed oldValue, address indexed sender);
	
    /// @dev value to update
    uint256 public currentValue;    
        
    constructor() Ownable(msg.sender) {        
        currentValue = 0;        
    }    

    /**
    * @dev Changes current value
    *
    * @param currentValue_ New value.
    */    
    function setCurrentValue(uint256 currentValue_) external {

		emit ValueUpdated(currentValue_, currentValue, msg.sender);        
        currentValue = currentValue_;        
    }
}

Se podrían ejecutar las siguientes instrucciones desde la consola para probar la ejecución de la función «setCurrentValue:

const testingContract = await hre.ethers.deployContract("TestingContract");

console.log("Testing contract address", testingContract.target);

await testingContract.setCurrentValue(10);

let currentValue = await testingContract.currentValue();

console.log("Current value", currentValue);

Al invocar la operación de escritura sobre la Hardhat Network, se mostrará por la consola información sobre la transacción.

El método debug_traceTransaction puede ser usado para depurar los OPCODES ejecutados. Se ilustra en el siguiente ejemplo, reemplazando $HASH_ID por el hash de la transacción:

let trace = await network.provider.send("debug_traceTransaction", ["$HASH_ID"]);

console.log(trace);

Tal y como se detalla en el artículo sobre Depurar smart contracts con Hardhat, para mostrar aún más información de depuración por la consola, se puede habilitar el parámetro «loggingEnabled: true» en el fichero «hardhat.config.js»:

networks: {
      hardhat: {
        loggingEnabled: true
      },
},

¿Cómo ejecutar scripts con Hardhat?

Las scripts de Hardhat son un mecanismo útil para ejecutar ficheros en javascript que utilicen las herramientas disponibles en Hardhat.

Para ello basta con importar el Hardhat Runtime Environment al comienzo de la script, teniendo igualmente acceso a las utilidades necesarias para leer y escribir en la Hardhat Network.

Pueden ser usadas también para desarrollar pruebas puntuales sobre los Smart contracts ejecutables de forma repetible en distintos momentos.

El siguiente fichero javascript agruparía todas las sentencias que hemos visto en el ejemplo anterior de uso de la consola:

const hre = require("hardhat");

async function main() {

  const testingContract = await hre.ethers.deployContract("TestingContract");

  console.log("Testing contract address", testingContract.target);

  await testingContract.setCurrentValue(10);

  let currentValue = await testingContract.currentValue();

  console.log("Current value", currentValue);
  
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

Se invocaría de la siguiente forma:

yarn hardhat run .\scripts\scriptFile.js

Con el parámetro «loggingEnabled: true» se mostraría aún más información de depuración.

Otra opción sería invocar la script interactuando con la Hardhat Network en modo proceso:

yarn hardhat node 
yarn hardhat run .\scripts\scriptFile.js --network localhost

Conclusión: interactuando con los Smart Contracts mediante javascript

En este artículo se han detallado dos procedimientos para interactuar con los Smart Contracts programados mediante código javascript, teniendo acceso a toda la funcionalidad que se inyecta en la Hardhat Runtime Environment mediante el fichero «hardhat.config.js».

Ambas utilidades pueden ser usadas para comprobar determinadas funciones de los contratos de manera no sistemática, sin la sobrecarga de las baterías de pruebas automáticas descritas en el artículo Depurar smart contracts con Hardhat.

También pueden ser útiles para probar de forma ágil el funcionamiento de los contratos en la fase temprana de desarrollo, a medida que se van añadiendo funciones.


¿Prefieres probar los smart contracts mediante test automatizados o te basta asegurar el correcto funcionamiento mediante sencillas scripts? Deja tus comentarios con tus impresiones.

Si quieres desarrollar lógica mediante Smart Contracts, contáctame, soy desarrollador blockchain y puedo ayudarte.