O que é Hardhat Ethereum?

O que é Hardhat Ethereum?

Hardhat é um ambiente de desenvolvimento projetado para facilitar a criação e implantação de aplicativos Web3, apoiado pela Ethereum Foundation e amplamente utilizado por grandes empresas dedicadas a construir a próxima geração da World Wide Web.

O Hardhat nos ajuda desde a implantação de um nó Ethereum local que inclui contas pré-carregadas com uma grande quantidade de ethers de teste até a implantação de nosso aplicativo em um nó local ou um Ethereum Testnet usando configurações simples. rede que veremos mais adiante.

Outras ferramentas populares no ecossistema são Ganache e Truffle.

Fonte: hardhat.org

Instalação

Para instalar o Hardhat primeiro precisamos instalar o Node.js, para o qual você pode executar os comandos abaixo de acordo com o SO que estiver utilizando.

Linux (Ubuntu):

sudo apt update
sudo apt install curl git
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

MacOS:

Podemos usar o Homebrew para instalação e automaticamente a última versão disponível será instalada:

brew install node

Você também pode usar o Node Version Manager (NVM):

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
nvm install 18
nvm use 18
nvm alias default 18
npm install npm --global # Upgrade npm to the latest version

Windows:

Atualmente, o site oficial do Hardhat recomenda a instalação do node usando o Windows Subsystem for Linux (WSL2), pois, como muitos de nós sabemos, o Windows não é a opção favorita dos desenvolvedores.

Você pode seguir este link para acessar o site oficial da Microsoft e continuar com as etapas de instalação do Node no Windows se preferir usar este sistema operacional ou se estiver se sentindo aventureiro.


Agora que temos o Node em nosso sistema operacional é hora de instalar o Hardhat criando um novo projeto com a ajuda do Node:

mkdir hardhat-example
cd hardhat-example
npm init

Agora podemos instalar o Hardhat:

npm install --save-dev hardhat

No mesmo diretório que instalamos o Hardhat executamos o seguinte comando:

npx hardhat

Selecione "Create an empty hardhat.config.js" com o teclado e pressione a tecla Enter.

Observação: o npm 7 e posteriores facilitam muito a instalação das dependências do Hardhat.

Quando o Hardhat é executado, ele procura o arquivo hardhat.config.js mais próximo a partir do diretório atual. Normalmente esse arquivo fica na raiz do projeto e uma configuração vazia é suficiente para o Hardhat começar a funcionar.

Contratos Inteligentes (Smart Contracts)

Em princípio, o conceito de contratos inteligentes pode ser um pouco difícil de digerir, supondo que você entenda o básico do Blockchain, podemos dizer que um contrato inteligente é um protocolo de transação cujo objetivo é controlar os eventos e ações dentro do acordo com o que foi alcançado entre as partes é automaticamente executado.

Por exemplo, um caso prático de celebração de um contrato inteligente dentro do Blockchain ocorre na locação ou compra de um apartamento, que pode ser executado quando o locador deposita uma determinada quantia de Ethers em uma conta gerenciada pelo contrato e, após Por sua vez, o locador pode entrar com uma ação para confirmar a entrega do imóvel.

Quando ambos aprovam seu acordo, o contrato inteligente transfere automaticamente os recursos para o locador, evitando um banco como intermediário (por exemplo). Caso não seja verificada a comprovação de ambas as partes, o contrato poderá efetivar a devolução dos recursos depositados pelo locatário ou a transferência parcial ao locador se a lógica do contrato assim o estipular.

Agora vamos ver como é um contrato inteligente na prática. A Ethereum usa a linguagem Solidity para a criação de contratos inteligentes.

⚠️
Neste post não entraremos em muitos detalhes sobre a linguagem, mas você pode encontrar mais informações na página oficial do Solidity. Se você se familiarizar com JavaScript, a linguagem será muito familiar para você.

Para começar vamos criar um novo diretório chamado contracts e dentro dele um arquivo que chamaremos de Token.sol (espanhol).

// SPDX-License-Identifier: UNLICENSED
// Los archivos de Solidity deben iniciar con pragma.
// Sera usado por el compilador para validar su version.

pragma solidity ^0.8.9;

// Este es el building block principal del contrato.
contract Token {
    
    // Variables de tipo String para identificar el token.
    
    string public name = "My Hardhat Token";
    string public symbol = "MHT";
    
    // El monto fijo de tokens.
    
    uint256 public totalSupply = 1000000;
    
    // Variable de tipo address usada para guardar cuentas.
    
    address public owner;
    
    // El tipo mapping es un mapa de tipo key/value map. 
    // Aquí guardaremos los balances de las cuentas.
    
    mapping(address => uint256) balances;
    
    // El evento Transfer ayuda a las aplicaciones fuera del Blockchain
    // a entender lo que pasa con el contrato.
    
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    
    /**
     * Contract initialization.
     */
    
    constructor() {
        
        // EL total del suministro es asignado al sender de la transacción,
        // que es la cuenta encargada de hacer deploy del contrato.
        
        balances[msg.sender] = totalSupply;
        owner = msg.sender;
    }
    /**
     * Función para transferir tokens.
     *
     */
    function transfer(address to, uint256 amount) external {
        
        // Verifica si el que envió la transacción tiene suficientes tokens.
        // Si la función “require” evalúa falso entonces la
        // transacción es revertida.
        
        require(balances[msg.sender] >= amount, "Not enough tokens");

        // Transfiere el monto.
        
        balances[msg.sender] -= amount;
        balances[to] += amount;

        // Notifica a la ampliación fuera del blockchain 
	    // sobre la transferencia.
        
        emit Transfer(msg.sender, to, amount);
    }
    /**
     * Función de solo lectura para obtener el balance del token 
	 * de una cuenta dada.
     *
     * El modificador `view` indica que no se hará ninguna modificación 
     * al estado del contrato y una transacción no es necesaria.
     */
     
    function balanceOf(address account) external view returns (uint256) {
        return balances[account];
    }
}

Compilar os contratos

Para compilar o contrato você precisa rodar no seu terminal:

npx hardhat compile 

Se tudo correr bem, você verá a seguinte mensagem:

$ npx hardhat compile
Compiling 1 file with 0.8.9
Compilation finished successfully

Nosso contrato foi compilado satisfatoriamente. Parabéns! Você acabou de criar seu primeiro contrato inteligente.

Deploy do Contrato Inteligente

Instalamos o Ethers, uma implementação de uma carteira Ethereum com utilitários que nos ajudarão no processo. No mesmo terminal executamos:

npm i ethers @nomiclabs/hardhat-waffle

Em seguida criamos uma pasta chamada scripts e dentro dela criamos o arquivo deploy.js e colamos o código abaixo.

const { ethers } = require("hardhat");
async function main() {
  const Token = await ethers.getContractFactory("Token");
  // Comienza el deploy, retornando una promesa que se resuelve 
  // en un objeto tipo contract
  const token = await Token.deploy();
  await token.deployed();
  console.log("Token Contract deployed to: ", token.address);
}

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

Agora copiamos e colamos o código abaixo no arquivo hardhat.config.js

/* hardhat.config.js */
require("@nomiclabs/hardhat-waffle")

module.exports = {
  defaultNetwork: "hardhat",
  networks: {
    hardhat: {
      chainId: 1337
    },
  },
  solidity: {
    version: "0.8.4",
    settings: {
      optimizer: {
        enabled: true,
        runs: 200
      }
    }
  }
}

Configuramos um nó de teste executando o seguinte comando no terminal:

npx hardhat node

E veremos uma lista com 19 contas que podem ser usadas para testar nosso contrato. Por padrão, a primeira conta será usada para o deploy do nosso contrato inteligente.

Agora podemos fazer o deploy do nosso contrato no nó local, executando o seguinte comando em nosso terminal:

npx hardhat --network localhost run scripts/deploy.js

E você verá o endereço do contrato:

Token Contract deployed to: 0x5fbdb2315678afec....xxxx

Hora de testar seu contrato inteligente

Chegou a hora de interagir com o contrato inteligente, para o qual a Hardhat também nos fornece um console JavaScript interativo com o qual é possível acessar as funções definidas em nosso contrato.

Em um novo console, execute o seguinte comando:

npx hardhat console

Welcome to Node.js v12.10.0.
Type ".help" for more information.
>

A interação com a rede Ethereum e os contratos inteligentes são operações assíncronas. Portanto, precisamos fazer uso de promessas para retornar os valores.
Para facilitar as coisas, o console Hardhat suporta o operador await.

Para usar esse recurso, você precisa usar o Node 10 ou superior.

Para se conectar a uma rede diferente da que temos por padrão usando o nó Hardhat local, podemos usar o seguinte comando:

npx hardhat console --network network_name

Que procurará o nome da rede específica no arquivo de configuração hardhat.config.js, por exemplo:

networks: {
  hardhat: {
    chainId: 1337
  },
  network_name: {
    url: API_URL,
    accounts: [`0x${PRIVATE_KEY}`]
  }
},

Por enquanto, usaremos apenas o nó Hardhat local e instanciaremos o contrato usando Ethers Contract Factory.

const Contract = await ethers.getContractFactory("Token")

Depois de obter a instância, precisamos anexar o endereço do contrato que acabamos de implantar para interagir com o contrato (mesmo endereço que obtivemos acima).

const contract = await Contract.attach("0x5fbdb2315678afec....xxxx")

Por exemplo, podemos transferir 100 tokens MHT para uma nova conta (você pode usar uma das contas disponíveis ao construir o nó com Hardhat, exceto a primeira, a mesma usada por padrão para implantar o contrato):

await contract.transfer('0x3C44CdDdB6a900...xxxxx', 100)

E você verá os detalhes da transação:

{
  hash: '0x6ca133f7770fe478b62ab0608cd1c6f51c097c4426a5296dc4ae15bbd4a2c6cd',
  type: 2,
  accessList: [],
  blockHash: '0x49bc61eb9b90f6b60b75482dc7d58bc6da4f396dba31f7be4b9840365178045e',
  blockNumber: 1,
  transactionIndex: 0,
  confirmations: 1,
  from: '0xf39Fd6e51aad88....xxxxx',
  gasPrice: BigNumber { value: "1875000000" },
  maxPriorityFeePerGas: BigNumber { value: "1000000000" },
  maxFeePerGas: BigNumber { value: "2750000000" },
  gasLimit: BigNumber { value: "29022808" },
  to: '0x3C44CdDdB6a900...xxxxx',
  value: BigNumber { value: "0" },
  nonce: 0,
  data: '0xa9059cbb0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc0000000000000000000000000000000000000000000000000000000000000064',
  r: '0xa91d4832956a8ac159c809387394a58a687948362d564d1dbcd68e76b09325b0',
  s: '0x0c061826e4dab67ae065e016837cd8457ca34a7c9eac09048258b0e5e5b8b958',
  v: 1,
  creates: null,
  chainId: 1337,
  wait: [Function (anonymous)]
}

Este console é muito útil para inspecionar o que realmente está acontecendo com nosso contrato e se é realmente o que esperamos de seu comportamento.

Conclusões

Hardhat nos fornece um ecossistema completo para poder gerar um nó, compilar contratos inteligentes e fazer o deploy sem a necessidade de usar ou criar uma rede Ethereum privada ou depender da disponibilidade de uma rede externa, também nos fornece os mecanismos para realizar a mesma implantação com as redes disponíveis para teste fornecidas pela Ethereum.

Usando o Hardhat, temos tudo o que precisamos para começar a escrever nosso aplicativo Web3.0.

Sucesso!

⚠️
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo.

A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.