Aula 223: Depuração com Hardhat
Depuração é uma habilidade essencial para qualquer desenvolvedor, especialmente para aqueles que trabalham com contratos inteligentes na blockchain Ethereum. Hardhat oferece um conjunto robusto de ferramentas para simplificar a depuração e aprimorar significativamente a experiência de desenvolvimento.
Nesta aula, vamos explorar como depurar contratos inteligentes Solidity usando Hardhat, abordando várias estratégias, ferramentas e melhores práticas.
Configurando o Hardhat
Antes de entrar na depuração, assegure-se de que você tenha o Hardhat instalado em seu projeto. Se você ainda não o configurou, pode fazê-lo executando os seguintes comandos:
mkdir meu-projeto-hardhat
cd meu-projeto-hardhat
npm init -y
npm install --save-dev hardhat
npx hardhat
Siga as instruções para criar um projeto básico do Hardhat.
Escrevendo um Contrato Inteligente de Exemplo
Vamos criar um contrato inteligente Solidity simples para fins de demonstração. Na pasta contracts
, crie um arquivo chamado SimpleStorage.sol
:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 private valor;
function definirValor(uint256 _valor) public {
valor = _valor;
}
function obterValor() public view returns (uint256) {
return valor;
}
function causarReversao() public pure {
require(false, "Esta função sempre reverte");
}
}
Neste contrato, temos uma funcionalidade de armazenamento simples e uma função que reverte intencionalmente para demonstrar a depuração.
Escrevendo Testes
Em seguida, vamos escrever alguns testes para nosso contrato na pasta test
. Crie um arquivo chamado SimpleStorage.js
:
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("Contrato SimpleStorage", function () {
let SimpleStorage;
let simpleStorage;
beforeEach(async function () {
SimpleStorage = await ethers.getContractFactory("SimpleStorage");
simpleStorage = await SimpleStorage.deploy();
await simpleStorage.deployed();
});
it("deve definir e obter o valor corretamente", async function () {
await simpleStorage.definirValor(42);
expect(await simpleStorage.obterValor()).to.equal(42);
});
it("deve reverter quando causarReversao for chamado", async function () {
await expect(simpleStorage.causarReversao()).to.be.revertedWith("Esta função sempre reverte");
});
});
Esses testes validam a funcionalidade de nosso contrato, garantindo que a definição e a obtenção de valores funcionem corretamente, e que a função causarReversao
se comporte como esperado.
Executando os Testes
Execute os testes usando o seguinte comando:
npx hardhat test
Se estiver tudo correto, você verá uma saída indicando que ambos os testes passaram.
Depurando com Hardhat
1. Usando Logs no Console
Uma das técnicas de depuração mais simples é usar logs no console. Hardhat suporta console.log
por padrão. Para adicionar capacidades de logs, você precisa importar console.sol
em seu contrato.
Modifique SimpleStorage.sol
da seguinte forma:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "hardhat/console.sol";
contract SimpleStorage {
uint256 private valor;
function definirValor(uint256 _valor) public {
console.log("Definindo valor como:", _valor);
valor = _valor;
}
function obterValor() public view returns (uint256) {
return valor;
}
function causarReversao() public pure {
require(false, "Esta função sempre reverte");
}
}
Com essa alteração, quando você executar seus testes novamente, verá logs na saída do console quando definirValor
for chamado.
2. Usando o Depurador do Hardhat
Outra ferramenta poderosa fornecida pelo Hardhat é o depurador embutido. Você pode executar seus testes com a flag --debug
para entrar no depurador quando um teste falhar.
npx hardhat test --debug
Uma vez que o depurador começa, você pode verificar o estado das variáveis e percorrer o código linha por linha. Use comandos como step
, next
, print
, e backtrace
para navegar e inspecionar a execução do seu código.
3. Rastreamentos de Pilha e Mensagens de Erro
Hardhat fornece rastreamentos de pilha e mensagens de erro detalhadas diretamente no console. Quando uma afirmação falha ou uma instrução require não é satisfeita, você receberá uma descrição clara do que deu errado, juntamente com as mais recentes estruturas da pilha. Essas informações são inestimáveis para diagnosticar rapidamente problemas.
Exemplo de Sessão de Depuração
Vamos supor que seu teste falhe ao chamar a função causarReversao
. Você usaria os seguintes comandos no depurador:
- Use
run
para ver o quão longe a execução foi antes da reversão. - Use
print nome_variavel
para ver os valores das variáveis relevantes. - Execute
backtrace
para observar a pilha de chamadas que levaram à falha.
Conclusão
Depurar contratos inteligentes Solidity pode ser simplificado usando os poderosos recursos do Hardhat. Desde o uso de logs simples no console até a exploração das capacidades completas do depurador, o Hardhat fornece aos desenvolvedores as ferramentas necessárias para identificar e resolver problemas de forma eficaz.
Nesta aula, abordamos:
- Configuração de um projeto Hardhat
- Escrita de um contrato inteligente Solidity simples
- Criação de testes para a funcionalidade do seu contrato
- Utilização de logs no console e do depurador do Hardhat para depuração eficaz
Com essas habilidades, você pode melhorar seu fluxo de trabalho de desenvolvimento em Solidity e criar contratos inteligentes mais robustos. Boa codificação!