Aula 095: Depurando Contratos no Remix
Depurar contratos inteligentes é uma habilidade crucial para qualquer desenvolvedor de Solidity. Nesta aula, vamos explorar como depurar efetivamente contratos inteligentes na Ethereum usando o Remix IDE. O Remix fornece ferramentas poderosas que podem ajudar a identificar problemas no seu código e melhorar a qualidade geral dos seus contratos inteligentes.
Começando com o Remix
O Remix é um IDE baseado em navegador que permite escrever, compilar e testar contratos Solidity. Para começar, abra o Remix acessando remix.ethereum.org. Você notará que a interface está dividida em vários painéis, incluindo um editor de código, terminal e explorador de arquivos.
Escrevendo um Contrato Inteligente de Exemplo
Vamos começar escrevendo um contrato inteligente simples que iremos depurar posteriormente. Aqui está um exemplo de um contrato que rastreia o saldo de usuários.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract BancoSimples {
mapping(address => uint) private saldos;
function depositar() public payable {
require(msg.value > 0, "O depósito deve ser maior que 0");
saldos[msg.sender] += msg.value;
}
function sacar(uint valor) public {
require(saldos[msg.sender] >= valor, "Saldo insuficiente");
saldos[msg.sender] -= valor;
payable(msg.sender).transfer(valor);
}
function consultarSaldo() public view returns (uint) {
return saldos[msg.sender];
}
}
Este contrato permite que os usuários depositem e sacam Ether, além de consultar seu saldo.
Erros Comuns em Solidity
Antes de mergulharmos na depuração, vamos apresentar alguns erros comuns que talvez queiramos rastrear. Para demonstração, vamos introduzir dois erros:
- Esquecer de incluir o modificador
payable
na funçãosacar
. - Uma verificação de saldo incorreta na função
sacar
que leva a um comportamento indesejado.
Passo 1: Simulando um Erro
Vamos introduzir intencionalmente um erro na função sacar
:
function sacar(uint valor) public {
require(saldos[msg.sender] >= valor, "Saldo insuficiente");
// Palavra-chave payable faltando
saldos[msg.sender] -= valor;
// Erro: Verificação de saldo incorreta
require(saldos[msg.sender] >= 0, "Erro de saldo negativo");
payable(msg.sender).transfer(valor);
}
Passo 2: Compilando e Implantando
Para testar nosso contrato, primeiro compile-o clicando na aba "Compilador Solidity" no painel à esquerda. Após a compilação bem-sucedida, mude para a aba "Implantar e Executar Transações". Implemente o contrato em uma VM JavaScript para teste local.
Passo 3: Depurando com o Remix
-
Usando o Depurador: Após implantar seu contrato, interaja com ele por meio da interface. Se você chamar a função
sacar
com um valor maior que seu saldo, encontrará um erro. Clique no ícone "Depurador" na barra lateral esquerda quando um erro ocorrer. Isso abrirá o ambiente de depuração. -
Passo a Passo pelo Código: O depurador permite que você avance pela execução do contrato. Use os comandos de passo a passo para navegar por cada linha da função
sacar
. Isso ajuda a identificar a falha nas cálculos de saldo e as consequências da verificação de saldo incorreta. -
Visualizar a Pilha de Chamadas: A pilha de chamadas mostra a série de chamadas de função que levaram ao erro. Pode ser bastante útil ver qual função foi chamada antes que a falha ocorresse.
Corrigindo os Erros
Agora, vamos corrigir nossos erros.
Função sacar Atualizada
function sacar(uint valor) public {
require(saldos[msg.sender] >= valor, "Saldo insuficiente");
saldos[msg.sender] -= valor;
// Certifique-se de não permitir saldo negativo
require(saldos[msg.sender] >= 0, "Erro de saldo negativo");
// Torne a função payable
payable(msg.sender).transfer(valor);
}
- Certifique-se que a função
sacar
tem a palavra-chavepayable
. - A segunda verificação
require
que assegura que os saldos não devem ser negativos pode ser removida, pois a primeira verificação já garante que o usuário só pode sacar se tiver fundos suficientes.
Passo 4: Testando Novamente
Após fazer as correções necessárias, recompile e reimplante o contrato. Teste a função sacar
novamente para garantir que os erros foram resolvidos.
Conclusão
A depuração é uma parte essencial do desenvolvimento de contratos inteligentes. O Remix fornece um ambiente abrangente para testar e depurar seus contratos Solidity. Familiarizar-se com suas funcionalidades de depuração permitirá que você escreva contratos inteligentes mais robustos e livres de erros.
Nesta aula, escrevemos um contrato inteligente simples, introduzimos e descobrimos erros, e aprendemos como corrigi-los usando as ferramentas de depuração do Remix. Continue praticando e boas codificações!