Hardhat, desplegar e interactuar con contratos

Primero crearemos un nuevo proyecto con Hardhat, seleccionando todas las opciones por defecto.

npx hardhat init

Para añadir diferentes blockchain con la que poder desplegar contratos e interactuar editaremos el fichero hardhat.config.js.
Por defecto module.exports tendrá este contenido.

module.exports = {
  solidity: "0.8.4",
};

Para poder añadir nuevas blockchain deberemos añadir el elemento networks. Dentro de networks creamos el elemento con el nombre que queramos para identificar las distintas blockchain.
Por ejemplo, para añadir la testnet de Meter, creamos el siguiente elemento.

meter_testnet: {
    url: "https://rpctest.meter.io",
    chainId: 83,
    accounts: [`${METER_TESTNET_PRIVATE_KEY}`]
},
  • meter_testnet es el nombre que le damos a la blockchain y el que usaremos para desplegar contratos e interactuar con ellos.
  • url es el RPC de la blockchain
  • chainId es el ID de la blockchain, fue introducido en el EIP-155 de etheruem para prevenir “replay attacks” entre las redes ETH y ETC
  • accounts es donde introducimos la clave privada con la que deseamos desplegar los contratos

Una buena práctica es nunca introducir la clave privada (ni cualquier tipo de contraseña) directamente en el código fuente.
Para ello extraeremos la clave privada de una variable de entorno.

const METER_TESTNET_PRIVATE_KEY = process.env.METER_TESTNET_PRIVATE_KEY;

Para crear la variable de entorno, en un terminal introducimos el siguiente comando.

export METER_TESTNET_PRIVATE_KEY=AQUI_LA_CLAVE_PRIVADA

Hardhat ha creado un contrato de prueba para nosotros llamado Greeter.sol, dentro de la carpeta contracts.
Usaremos este contrato para probar el despliegue de un contrato en la red testnet de Meter usando Hardhat.

Hardhat también ha creado un script llamado sample-script.js para desplegar el contrato. Este script se encuentra en la carpeta scripts.

Para desplegar el contrato en la testnet de Meter ejecutaremos el siguiente comando. Recordad que antes de ejecutar el comando debéis crear la variable de entorno METER_TESTNET_PRIVATE_KEY.

npx hardhat run --network meter_testnet scripts/sample-script.js

Si todo ha funcionado correctamente, Hardhat devolverá un resultado similar al siguiente.

Compiled 2 Solidity files successfully
Greeter deployed to: 0x12eaDd210dEa8B35A9Bb38c884493B6dAE79D65A

Donde “deployed to” es la dirección del contrato que se ha creado. Todos los contratos desplegados en la red de Meter (y en todas las blockchain), tienen su dirección que es única e irrepetible.

Si queremos desplegar el contrato en diferentes blockchain, por ejemplo, en la Mainnet de Meter o en el nodo local, deberemos añadir más configuraciones en el fichero hardhat.config.js.

networks: {
    meter_testnet: {
      url: "https://rpctest.meter.io",
      chainId: 83,
      accounts: [`${METER_TESTNET_PRIVATE_KEY}`]
    },
    meter_mainnet: {
      url: "https://rpc.meter.io",
      chainId: 82,
      accounts: [`${METER_MAINNET_PRIVATE_KEY}`]
    },
    hardhat: {
      chainId: 31337
    }
  } 

Para desplegar el contrato en estas blockchain, los comandos a usar son los siguientes.

npx hardhat run --network meter_mainnet scripts/sample-script.js
npx hardhat run --network localhost scripts/sample-script.js

Recordad que si desais desplegarlo en el nodo local primero tenéis que ejecutarlo con este comando.

npx hardhat node

Hasta aquí hemos visto cómo podemos desplegar contratos en diferentes redes usando Hardhat.

Ahora vamos a la parte más divertida, interactuar con el contrato desde la línea de comandos de Hardhat.
Para ello nos conectaremos a la consola de Hardhat, donde le indicaremos con qué blockchain deseamos interactuar.

npx hardhat console --network meter_testnet

Para conectarnos a las otras redes deberemos ejecutar estos comandos.

npx hardhat console --network meter_mainnet
npx hardhat console --network localhost

Una vez dentro de la consola creamos una constante con el nombre del contrato de Solidity y otra con el mismo nombre, pero todo en minúsculas con la dirección donde se desplegó el contrato.

const Greeter = await ethers.getContractFactory('Greeter');
const greeter = await Greeter.attach('0x12eaDd210dEa8B35A9Bb38c884493B6dAE79D65A');

Ya podemos interactuar con el contrato. Vamos a ejecutar el comando que nos devolverá el contenido actual de la variable greeting.

await greeter.greet();
'Hello, Hardhat!'

Este comando, al ser de lectura, no consume gas por lo que genera un “gasto” en MTR.

Si quisiéramos cambiar el valor de la variable greeting, como es una acción que cambia el estado de la blockchain de Meter, generá un gasto que deberemos pagar con MTR.
Para ello ejecutaremos el siguiente comando.

await greeter.setGreeting('Hola, mundo!');

Este comando genera una respuesta con lo que se ha escrito en la blockchain.

{
  hash: '0x9c5bf40164dac906cd22082ef777fdc01e3342c9da182d76547ffda0dac4362e',
  type: 0,
  accessList: null,
  blockHash: '0x01c058a3fe1cb97efbee7424816873a614c6ce1658a2b8c2bbd3f3d65bd12031',
  blockNumber: 29382819,
  transactionIndex: 0,
  confirmations: 3,
  from: '0x0EE6568052Df535D9b1ca9139E2AD680442EDfCE',
  gasPrice: BigNumber { value: "1" },
  gasLimit: BigNumber { value: "40804" },
  to: '0x12eaDd210dEa8B35A9Bb38c884493B6dAE79D65A',
  value: BigNumber { value: "0" },
  nonce: 1119606006,
  data: '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c486f6c612c206d756e646f210000000000000000000000000000000000000000',
  r: '0x7af7d665650cdc8f701e184c89d0dd1fdbcc2078dd679a8e0cf33dd15ac228e4',
  s: '0x52fc84d7243a63712c23409419dffb204ed7e76c7e295f3df7d60107b6e06d27',
  v: 202,
  creates: null,
  chainId: 83,
  wait: [Function (anonymous)]
}

Podemos comprobar como efectivamente el valor de la variable greeting ha sido modificado volviendo a ejecutar este comando.

> await greeter.greet();
'Hola, mundo!'

Podemos ver en el explorador de bloques de Meter (testnet) la creación del contrato aquí https://scan-warringstakes.meter.io/tx/0xdf2395150ec051e188947dd55d7d3a6769e25195d8dd5afc485d574fa941d2af

En esta otra URL podemos ver la ejecución del método setGreeting la cual ha modificado el estado de la blockchain Meter https://scan-warringstakes.meter.io/tx/0x9c5bf40164dac906cd22082ef777fdc01e3342c9da182d76547ffda0dac4362e

En esta URL podemos observar cómo esta acción ha tenido un coste en MTR de 0.018881.
Las transacciones en la red Meter siempre son estables y con un coste muy reducido.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *