No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Entorno de desarrollo con Hardhat

16/27
Recursos

Existen diversos entornos de desarrollo que puedes utilizar para el desarrollo de contratos inteligentes. Posiblemente, el m谩s popular por estos d铆as en la comunidad de Ethereum, es Hardhat.

Desarrollo y despliegue de contratos con Hardhat

Hardhat es un entorno de desarrollo que nos permitir谩 trabajar durante todo el ciclo de vida de un smart contract en redes basadas en EVM. Desde la configuraci贸n del entorno, el desarrollo del contrato, las pruebas del mismo, depuraci贸n, compilaci贸n, hasta llegar a la etapa del despliegue en la blockchain.

Hardhat est谩 basado en Javascript, por lo que todo tu conocimiento previo en el lenguaje y en tecnolog铆as como NPM te ser谩 de gran ayuda para desarrollar cualquier proyecto.

Instalaci贸n de Hardhat

El primer paso para utilizar Hardhat es la instalaci贸n del framework en tu computador. Para esto, deber谩s crear un nuevo proyecto con ayuda de NPM e instalar Hardhat como dependencia.

npm init -y npm install hardhat npm install @nomicfoundation/hardhat-toolbox

Recuerda que deber谩s tener listo tu entorno de desarrollo basado en NodeJS en tu computador para utilizar NPM. Si bien los contratos se desarrollan con Solidity, necesitar谩s la ayuda de Javascript para crear, testear y desplegar tu contrato.

Creaci贸n y configuraci贸n de un proyecto con Hardhat

Cuando dispongas de tu proyecto base creado con npm, el comando npx hardhat iniciar谩 dentro de este un nuevo proyecto con las configuraciones base de Hardhat.

Ver谩s un nuevo archivo llamado hardhat.config.js, el cual modificaremos posteriormente para el despliegue del contrato en la blockchain.

Con Hardhat inicializado, es momento de crear tu primer contrato con este framework. Para esto, crea un directorio llamado contracts con el archivo .sol que conforma tu contrato inteligente. Para el siguiente contrato, el archivo se llama Counter.sol:

```js // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.1 <0.8.19;

contract Counter { uint counter;

constructor(uint _counter) {
    counter = _counter;
}

function getCounter() public view returns (uint) {
    return counter;
}
function increment() public {
    counter++;
}

} ```

Desarrollo de pruebas unitarias en Hardhat

Una de las partes esenciales del desarrollo de smart contract son sus pruebas unitarias. Tener un buen set de pruebas para asegurar el buen funcionamiento de tu contrato es fundamental.

Dentro de tu proyecto, crea un directorio llamado test con un archivo llamado counter.js donde escribiremos las pruebas del contrato Counter.sol. Haremos uso de la librer铆a ether.js, que ya viene integrada dentro de Hardhat. Tambi茅n necesitar谩s instalar Chai que utilizaremos para evaluar los resultados de las pruebas.

``` const { expect } = require('chai') const { ethers } = require('hardhat')

describe('Counter Contract', () => { it('Should increment the counter', async () => { const Counter = await ethers.getContractFactory('Counter') const counter = await Counter.deploy(0) await counter.increment() const updateCounter = await counter.getCounter()

    expect(updateCounter).to.equal(1)
})

}) ```

En estas l铆neas de c贸digo de la prueba, escrita con Javascript, estamos creando una prueba unitaria que en primer lugar captura el contrato Counter.sol. Instancia el mismo y ejecutar la funci贸n increment(). Luego, capturamos el valor actual del contador y corroboramos que el mismo sea de uno.

Finalmente, con el comando npx hardhat test, ejecutar谩s las pruebas y ver谩s los resultados por consola. De esta forma, ya puedes probar la l贸gica de tu contrato, sin necesidad de desplegar en mismo en la blockchain y sin comisiones.

Preparaci贸n para el despliegue del contrato

Cuando est茅s seguro de que tu contrato est谩 finalizado, con un buen set de pruebas que demuestre su correcto funcionamiento, es momento de automatizar el despliegue del mismo con Hardhat.

Comienza creando un directorio llamado scripts con un archivo llamado deploy.js. Aqu铆 escribiremos, tambi茅n utilizando Javascript, un script que automatiza el despliegue del contrato en la blockchain.

``` const { ethers } = require("hardhat");

async function main(){ const [deployer] = await ethers.getSigner(); console.log("Deployer",deployer);

const Counter = await ethers.getContractFactory('Counter');
const counter = await Counter.deploy(0);

console.log ("Counter Contract Addres",counter.address);

} main() .then(() => process.exit(0)) .catch( (error) => { console.error(error); process.exit(1); }); ```

Es momento de retomar la configuraci贸n del hardhat.config.js. Aqu铆, configuraremos la red de Ethereum a la cual queremos desplegar el contrato, junto con la informaci贸n necesaria para esto.

``` require("@nomicfoundation/hardhat-toolbox");

/* @type import('hardhat/config').HardhatUserConfig / module.exports = { solidity: "0.8.18", networks: { goerli: { url: 'PROVIDER_URL', accounts: [ 'METAMASK_PRIVATE_KEY' ] } } }; ```

Para este ejemplo, desplegaremos el contrato en Goerli. Hardhat te permitir谩 desplegar contratos en Sepolia o cualquier otra red basada en EVM.

Observa que necesitar谩s dos datos muy importantes y delicados, la clave privada de tu wallet que pagar谩 por la comisi贸n del despliegue del contrato. Aseg煤rate de tener fondos suficientes, en este caso, en Goerli. Tambi茅n necesitar谩s una URL que apunte a un nodo de Ethereum.

Metamask te permitir谩 f谩cilmente exportar la clave privada, no est谩 de m谩s mencionar una vez m谩s la importancia de segurizar bien esta informaci贸n. Por otro lado, como es todo un reto levantar tu propio nodo de Ethereum, servicios como Infura o Alchemy te otorgar谩n una URL para conectarse a sus nodos r谩pidamente.

Si ya tienes todo configurado correctamente, el siguiente paso ser谩 el despliegue del contrato. Pero eso lo veremos en la siguiente clase.

Conclusi贸n

Has visto a lo largo de esta clase lo importante y 煤til que es trabajar con entornos de desarrollo como Hardhat. Hemos podido desarrollar un contrato, probarlo y tener todo listo para su posterior despliegue. Tambi茅n habr谩s observado la importancia de Javascript, aunque realmente no necesitas mucho conocimiento en el lenguaje, solo conocer lo b谩sico.

Vayamos por el 煤ltimo paso y despleguemos ese contrato con Hardhat.


Contribuci贸n creada por: Kevin Fiorentino (Platzi Contributor).

Aportes 9

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

  • Instalaci贸n de Hardhat
  1. Desde hardhat. org descargamos la herramienta
  2. Creamos un proyecto con npm init
  3. Nos aseguramos que se haya creado el package.json
  4. npm install --save-dev @nomicfoundation/hardhat-toolbox
  5. Configuramos hardhat. Para esto usamos npx hardhat
  6. Seleccionar Create an empty hardhat.config.js
  7. Nos aseguramos que se haya creado el hardhat.config.js
  • Una vez que la configuraci贸n de Hardhat esta lista vamos a VSCode.
  1. Creamos un nuevo folder llamado Contracts
  2. Dentro de esta carpeta creamos Counter.sol
  3. Escribimos el contrato (o copiamos el que escribimos en Remix en la clase anterior)
  • Pruebas unitarias
  1. Creamos un folder llamado Test
  2. Creamos dentro un archivo counter.js (ya que utilizaremos JavaScript)
  3. Vamos a utilizar la herramienta chai para escribir los testcases.
  4. Para poder instanciar un smart contract dentro de JavaScript vamos a utilizar ethers.js
  • Despliegue
  1. Creamos folder Scripts
  2. Creamos dentro de Scripts el archivo deploy.js
  • Actualizar config de hardhat para indicar la red de goerli y las llaves privadas

Dejo mis apuntes, m谩s el codigo de la clase.

Les comparto el c贸digo:

// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.7;

contract Counter {
  uint counter;

  constructor(uint _counter) {
    counter = _counter;
  }

  function getCounter() public view returns(uint) {
    return counter;
  }

  function increment() public {
    counter ++;
  }
}

Goerli no me funcion贸 y en el faucet me recomendaba usar Sepolia as铆 que segu铆 exactamente el paso a paso pero cambiando todo por Sepolia y funcion贸.

Para hacerlo basta:

  • Usar seplia en metamask como red de prueba (test network)
  • Crear la app en Alchemy con Sepolia y obtener la URL para luego usarla en hardhat.config.js
  • En hardhat.config.js declarar que se usa Sepolia en vez de Goerli osea usar el comando
require("@nomicfoundation/hardhat-toolbox");

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.18",
  networks: {
    sepolia: {
      url:' obtenida de alchemy usando app en sepolia',
      accounts:[
        "AAAABBBBCCCC"
      ]
    }
  }
};
  • en la l铆nea de comandos 鈥溾搉etwork sepolia鈥

Codigo de deploy.js

<code> 
const { ethers} = require("hardhat");

async function main(){
    const [deployer] = await ethers.getSigner();
    console.log("Deployer",deployer);

    const Counter = await ethers.getContractFactory('Counter');
    const counter = await Counter.deploy(0);

    console.log ("Counter Contract Addres",counter.address);

}
main()
    .then(() => process.exit(0))
    .catch( (error) => {
        console.error(error);
        process.exit(1); 
    });
npm init -y
npm install --save-dev hardhat
npm install --save-dev @nomicfoundation/hardhat-toolbox

Edita el archivo hardhat.config.js y agrega el c贸digo:

require(鈥@nomicfoundation/hardhat-toolbox鈥);

Edita tu contrato Counter.sol (carpeta contracts) en tu editor preferido (aqu铆 usamos VSCode) y luego puedes compilarlo con:

npx hardhat compile

puedes ejecutar tu test con:

npx hardhat test

Si vas a usar la network de Sepolia entonces:

{
//TU CODIGO ...
  networks: {
    sepolia: {
      url: `TU_URL}`,
      accounts: [SEPOLIA_PRIVATE_KEY]
    }
  }

No me aparecen los colores en Counter.sol

En el archivo deploy.js, no desestructurar el resultado de ethers.getSigner() dado que ya no es iterable.
De lo contrario tendr谩s el error:

TypeError: (intermediate value) is not iterable
at main (/Users/Eber/Documents/3.Learning/1.blockchain/ethereum/counterContract/scripts/deploy.js:4:22)

.

C贸digo completo

const { ethers } = require("hardhat");

async function main() {
  const deployer = await ethers.getSigner();
  console.log("Deployer", deployer);

  const Counter = await ethers.getContractFactory('Counter');
  const counter = await Counter.deploy(0);

  console.log("Counter Contract Address", counter.address);
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });