No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

15 Días
8 Hrs
13 Min
42 Seg

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?

  • 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.

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 “–network sepolia”

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 ++;
  }
}

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);
  });