SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
04.12.2024

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!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!