DEV Community

Cover image for HardHat: "Hola Mundo!" en un Blockchain de Prueba
Ahmed Castro
Ahmed Castro

Posted on • Updated on

HardHat: "Hola Mundo!" en un Blockchain de Prueba

Truffle es una herramienta nueva que nos ayuda a compilar y deployar smart contracts en el blockchain. En este blog escribiremos un "Hola mundo!" en Solidity para introducirnos al desarrollo de aplicaciones decentralizadas.

Antes de iniciar asegurate de instalar node (te recomiendo que lo instales via nvm) y creamos nuestra carpeta de proyecto e instalamos las dependencias.

Antes de iniciar creamos nuestra carpeta de proyecto e instalamos las dependencias.

mkdir MyHardhatProject
cd MyHardhatProject
npm install --save-dev hardhat
Enter fullscreen mode Exit fullscreen mode

1. Compilar un contrato

Primero inicializamos HardHat. Usamos este comando y apretamos enter un par de veces para mantener los valores predeterminados.

npx hardhat
Enter fullscreen mode Exit fullscreen mode

Ahora podemos borrar el contrato que viene por defecto Greeter.sol y escribimos nuestro nuevo en la carpeta contracts/.

contracts/MyContract.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

contract MyContract {
    string public hello;

    constructor()
    {
        hello = "Hola mundo!";
    }

    function setHello(string memory _hello) public {
        hello = _hello;
    }
}
Enter fullscreen mode Exit fullscreen mode

Antes de compilar, necesitamos indicarle a HardHat que vamos a usar la versión 0.8.4 de solidity.

hardhat.config.js

[...]
module.exports = {
  solidity: "0.8.4",
};
[...]
Enter fullscreen mode Exit fullscreen mode

Ahora podemos compilar nuestro contrato.

npx hardhat compile
Enter fullscreen mode Exit fullscreen mode

2. Deploy local

Levantamos un servidor de blockchain de prueba local.

npx hardhat node
Enter fullscreen mode Exit fullscreen mode

Modificamos el script de deploy de ejemplo para ajustarlo a nuestro contrato.

scripts/sample_script.js

const hre = require("hardhat");

async function main() {
  const MyContract = await hre.ethers.getContractFactory("MyContract");
  const my_contract = await MyContract.deploy("Hello, Hardhat!");

  await my_contract.deployed();

  console.log("MyContract deployed to:", my_contract.address);
}
main()
  .then(() => process.exit(0))
  .catch(error => {
    console.error(error);
    process.exit(1);
  });

Enter fullscreen mode Exit fullscreen mode

Ahora sí podemos deployar nuestro contrato en el blockchain local de HardHat.

npx hardhat run --network localhost scripts/sample-script.js
Enter fullscreen mode Exit fullscreen mode

Interactuamos con el contracto mediante la consola de HardHat. Que imprimirá el address del contrato.

npx hardhat console --network localhost
Enter fullscreen mode Exit fullscreen mode

Una vez dentro de la consola de HardHat podemos leer variables y ejecutar funciones. Asegurate de colocar el address de tu contrato que se mostró cuando hiciste deploy.

const MyContract = await ethers.getContractFactory("MyContract")
const my_contract = await MyContract.attach("0x5FbDB2315678afecb367f032d93F642f64180aa3")
await my_contract.hello()
await my_contract.setHello("Probando...")
await my_contract.hello()
Enter fullscreen mode Exit fullscreen mode

3. Deploy en un testnet

Asegúrate de tener lo siguiente:

  1. Una wallet instalada, mi recomendación es metamask
  2. Fondos de Kovan testnet que puedes conseguir gratis en el faucet
  3. Una llave para Kovan en Infura

En nuestro archivo de configuración de HardHat agregamos la opción kovan dentro de networks como se indica a continuación. Asegurate de pegar tu infura Project ID en la variable infuraKey.

hardhat.config.js

require("@nomiclabs/hardhat-waffle");

task("accounts", "Prints the list of accounts", async () => {
  const accounts = await ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

const infuraKey = "a3e70735b....";
const fs = require('fs');
const mnemonic = fs.readFileSync(".secret").toString().trim();

module.exports = {
  solidity: "0.8.4",
  networks: {
    kovan: {
      url: `https://kovan.infura.io/v3/${infuraKey}`,
      accounts: {mnemonic: mnemonic}
    }
  },
};
Enter fullscreen mode Exit fullscreen mode

⚠️⚠️⚠️ Ahora copia tu mnemonic o seed pharase desde Metamask (Settings > Security & Privacy > Reveal Seed Phrase). Pero ten mucho cuidado y nunca mostrar esto a nadie porque esta es la llave privada de tus fondos.⚠️⚠️⚠️

Alt Text

⚠️⚠️⚠️Copia tu seed pharase en un archivo vacío y llámalo .secret. Agregalo a tu .gitignore. ¡No olvides agregarlo a tu .gitignore!⚠️⚠️⚠️

De nuevo, recuerda agregar este archivo a tu .gitignore.

.gitignore

.secret
Enter fullscreen mode Exit fullscreen mode

Ahora deployamos en Kovan e ingresamos en la consola, muy similar a como lo hicimos antes. Esto mostrará el address de tu contrato. Cópialo porque lo usaremos más adelante.

npx hardhat run --network kovan scripts/sample-script.js
Enter fullscreen mode Exit fullscreen mode
npx hardhat console --network kovan
Enter fullscreen mode Exit fullscreen mode

Podemos interactuar con el contrato de la misma manera que lo hicimos anteriormente. Asegurate de agregar el address de tu contrato cuando ejecutes la funcion attach.

const MyContract = await ethers.getContractFactory("MyContract")
const my_contract = await MyContract.attach("0x5FbDB2315678....")
await my_contract.hello()
await my_contract.setHello("Probando...")
await my_contract.hello()
Enter fullscreen mode Exit fullscreen mode

El siguiente paso será conectar esto con un frontend web pero será en otro post para no seguir alargando.

Gracias por ver este tutorial!

Sígueme en dev.to y en Youtube para todo lo relacionado al desarrollo en Blockchain en Español.

Top comments (2)

Collapse
 
xixfin profile image
xixfin

TypeError: no matching function (argument="key", value="deployed", code=INVALID_ARGUMENT, version=6.6.7)
at makeError (C:\prypc01\node_modules\ethers\src.ts\utils\errors.ts:670:21)
at assert (C:\prypc01\node_modules\ethers\src.ts\utils\errors.ts:694:25)
at assertArgument (C:\prypc01\node_modules\ethers\src.ts\utils\errors.ts:706:5)
at Interface.getFunctionName (C:\prypc01\node_modules\ethers\src.ts\abi\interface.ts:542:23)
at buildWrappedMethod (C:\prypc01\node_modules\ethers\src.ts\contract\contract.ts:342:34)
at BaseContract.getFunction (C:\prypc01\node_modules\ethers\src.ts\contract\contract.ts:870:22)
at Object.get (C:\prypc01\node_modules\ethers\src.ts\contract\contract.ts:768:39)
at main (C:\prypc01\scripts\sample.js:7:21)
at processTicksAndRejections (node:internal/process/task_queues:95:5) {
code: 'INVALID_ARGUMENT',
argument: 'key',
value: 'deployed'
}

Collapse
 
johnsonojo profile image
Johnson Ojo

Hello,
I'm getting this same error.
Have you been able to fix it?