Como subir uma blockchain local para testes com HardHat Network

Cripto

Como subir uma blockchain local para testes com HardHat Network

Luiz Duarte
Escrito por Luiz Duarte em 11/12/2023
Junte-se a mais de 34 mil devs

Entre para minha lista e receba conteúdos exclusivos e com prioridade

Quando estamos desenvolvendo aplicações web3 ou somente smart contracts é comum a necessidade de testá-los em diferentes ambientes. O primeiro ambiente mais óbvio são em alguma suíte de testes unitários, como a combinação Mocha + Chai e outras. Depois, você precisa testar em uma blockchain para garantir que de fato o comportamento esperado se mantenha. É aí que começam nossos problemas.

Isso porque apesar de existirem as Testnets das redes famosas como BSC, Avalanche, Polygon e até mesmo da Ethereum, essas redes exigem que você tenha fundos de teste para conseguir fazer deploy do seu contrato, executar as transações, etc. Isso não seria um problema se não fosse o fato de TODAS as Testnets, sem exceção serem uma porcaria quando o assunto é fornecer fundos de teste, geralmente nos enviando para faucets bugados e com poucos recursos.

Sendo assim, o ideal é que você tenha uma solução local/privada de blockchain com fundos infinitos, a fim de que consiga realizar os seus testes sem qualquer limitação e com total controle do ambiente. E é justamente isso que vou ensinar hoje: como subir uma blockchain privada/local para desenvolvimento, na sua própria máquina. Mais tarde sim, deverá testar na Testnet “real” e por fim colocar em produção.

Neste artigo utilizaremos a solução HardHat Network, parte integrante do toolkit HardHat que eu apresento as principais características no vídeo abaixo.

#1 – Executando uma blockchain

A primeira etapa é a criação de um projeto HardHat na sua máquina, um toolkit muito popular que, dentre outras ferramentas, fornece meios de rodar uma blockchain local/privada na sua máquina, justamente o que precisamos. Essencialmente, um projeto HardHat começa como outro projeto Node.js, então certifique-se de ter o Node.js instalado. Caso não saiba como instalar, o vídeo abaixo pode ajudar.

Com o Node.js instalado, crie uma pasta chamada blockchain-local-hardhat na sua máquina e dentro rode o comando de inicialização do Node.js:

O restante desse tutorial pode ser acompanhado no vídeo abaixo, se preferir.

Depois, entre na pasta do projeto e instale o HardHat com o comando abaixo:

E por fim, inicialize um projeto HardHat na mesma pasta com o comando abaixo:

O CLI do HardHat vai lhe fazer uma pergunta sobre qual template deseja usar. Escolha a última opção, que fala sobre criar um projeto vazio. Neste projeto vai ter um arquivo hardhat.config.js. Com o projeto criado, é hora de subir o nó local, com o comando abaixo:

Se tudo foi feito corretamente, o terminal vai subir uma blockchain chamada HardHat Network e apresentar uma série de contas de teste cheias de fundos para usar, com seus respectivos endereços públicos e chaves privadas, como abaixo.

Muita atenção aqui: essas carteiras funcionam apenas na sua blockchain local, que acabou de subir. Não adianta querer transferir os fundos delas ou para elas que vai dar ruim, não vai funcionar. Aliás, esta é a mesma rede que o HardHat sobe para executar seus testes unitários automatizados.

Outra opção é subir a HardHat Network forkando alguma rede existente, para ter um clone do estado dela, incluindo a Mainnet da Ethereum. O segredo aqui é que só funciona se você possui conta na Infura ou Alchemy, pois deve fornecer a API URL desses provedores de blockchain as a service junto ao parâmetro fork, como abaixo:

Isso é especialmente útil para testar contratos que já estão em produção, embora as carteiras são sempre somente aquelas 10 que você recebe quando o nó termina de subir. As contas das redes forkadas não são clonadas.

Independente se você subiu uma blockchain zerada ou um fork, basta manter este terminal funcionando, sem interrompê-lo e você terá uma blockchain local rodando em http://127.0.0.1:8545 na sua máquina com chainId 31337, seguindo todo o padrão Ethereum, apenas zerada, sem o histórico de blocos da mesma. Se precisar usar o VS Code para alguma outra coisa, recomendo abrir outra janela.

Uma última dica ainda nesse tópico, é configurar no seu package.json o script de start para subir essa blockchain local:

Assim, sempre que quiser subi-la (ou mesmo deixando sempre up com PM2) você pode rodar com o comando abaixo, bem mais simples.

Legal né!

Curso Beholder
Curso Beholder

#2 – Configurando uma carteira

Agora que você tem uma blockchain local rodando na sua máquina, outra dica é você configurar sua carteira MetaMask para algumas das contas de teste. Isso é especialmente útil se estiver testando uma aplicação web3 (dapp), pois ela vai precisar se conectar com sua carteira no browser. Sendo assim, a primeira coisa que deve fazer é configurar uma nova rede na MetaMask.

Se você não tem uma carteira MetaMask ainda, o vídeo abaixo ensina a criar uma.

Vá em redes, adicionar rede, adicionar manualmente, para ter acesso ao formulário de adição de redes. Preencha como abaixo:

  • Nome da Rede: HardHat
  • Novo URL da RPC: http://localhost:8545 ou http://127.0.0.1:8545
  • ID da cadeia: 31337
  • Símbolo da moeda: ETH

Salve e selecione a rede HardHat na sua MetaMask para ver a sua carteira zerada.

Agora o próximo e último passo é configurar alguma das contas de teste geradas pra gente pelo HardHat, de preferência a primeira para evitar confusão. Para isso, copie a chave privada dela que apareceu no terminal e volte na MetaMask, acessando a guia Contas no topo, adicionar contas ou carteiras, importar e informa a sua chave privada.

Pronto, você é o mais novo ricaço do mundo cripto. 😀

Com isso, agora você tem uma blockchain local rodando e sua carteira apontada para ela. Você irá reparar que vão aparecer alguns avisos no terminal da sua blockchain, indicando que ela recebeu alguns comandos (da MetaMask neste caso). Isso é especialmente útil para ver que ela está recebendo as calls e transactions corretamente.

Atenção: se você precisar reiniciar a HardHat Network depois de ter importado contas na MetaMask vai ter de remover e importar as contas novamente ou ao menos limpar o cache de atividades da carteira (Settings > Advanced > Clear Cache) porque ela se perde completamente.

Como próximo passo, recomendo que teste o deploy de algum smart contract, como ensinado neste tutorial. Em dado momento ele vai falar para configurar a MetaMask, pode pular esta etapa obviamente. Já quando ele pedir as configurações da blockchain para deploy, use estas:

Apenas atenção especial ao mnemonic, que é o default do HardHat e vinculado àquelas carteiras que você viu no terminal quando inicializou o node dele.

Para executar o script de deploy, é da mesma forma que já deve estar acostumado, um exemplo abaixo.

Certifique-se de consultar o terminal do HardHat Network que você subiu para se certificar que o deploy ocorreu nele com sucesso.

A seguir, vou mostrar como rodar alguns comandos de teste nessa blockchain.

Curso Web3 para Iniciantes

#3 – Testando com HardHat Console

Outro recurso muito útil, uma vez que você esteja com um nó da HardHat Network rodando na sua máquina, é abrir outro terminal com o HardHat Console. Para isso, rode o comando abaixo (local é o nome da minha rede no hardhat.config.js).

Vai iniciar um CLI de controle da HardHat Network no seu terminal, onde usando a biblioteca EthersJS você consegue enviar comandos para a blockchain. Como a maioria dos comandos são assíncronos, não esqueça de usar await para que esperar pelo término deles (felizmente o HH Console já um inclui todos os comandos de uma função async por padrão, então não se preocupe com isso.

Qualquer comando que você faria com EthersJS vai fazer funcionar. Por exemplo para consultar o saldo de uma conta, use o código abaixo.

E para carregar um contrato instalado na HH Network e executar uma função dele, você pode fazer como abaixo (o contrato em questão já deve estar na blockchain após um deploy bem sucedido pois você precisa do endereço dele):

Outra tarefa necessária eventualmente é se conectar em nome de outra conta, dentre as existentes na blockchain. O código abaixo mostra como pegar contas de teste e se conectar no contrato usando uma delas (o padrão é sempre usar a owner/primeira).

Agora tudo que você fizer com contract, será realizado no mesmo contrato, mas em nome da otherAccount.

E é isso por hoje, espero que tenha gostado!

TAGS:

Olá, tudo bem?

O que você achou deste conteúdo? Conte nos comentários.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *