Bugs em smart contracts custam caro — literalmente. Contratos na blockchain são imutáveis, e vulnerabilidades exploradas significam perda irreversível de fundos. Conhecer e prevenir as falhas mais comuns é essencial para qualquer desenvolvedor Solidity.
Reentrancy: o ataque clássico
O ataque de reentrancy ocorre quando um contrato externo chama de volta o contrato vulnerável antes que a execução original termine. O hack do DAO em 2016 foi causado exatamente por isso, resultando na perda de $60 milhões em ETH.
Prevenção: siga o padrão Checks-Effects-Interactions. Primeiro verifique condições, depois atualize o estado, e só por último interaja com contratos externos. Use o modifier nonReentrant do OpenZeppelin como camada extra de proteção. Prefira pull payments (o usuário saca) sobre push payments (o contrato envia).
Integer overflow/underflow
Valores uint256 que ultrapassam seus limites podem causar comportamentos desastrosos. Em Solidity 0.8+, overflows causam revert automático, mas em versões anteriores ou em blocks unchecked{}, o problema persiste. Use SafeMath para versões antigas e cuidado com blocos unchecked para otimização de gas — eles desabilitam essa proteção.
Front-running e MEV
Transações na mempool são públicas antes de serem mineradas. Bots de MEV podem ver sua transação, executar a mesma operação antes de você (front-running), e lucrar com a diferença de preço. Isso é especialmente perigoso em DEXs e leilões on-chain.
Mitigações incluem: commit-reveal schemes (commit do hash primeiro, revela depois), uso de Flashbots para transações privadas, slippage limits em swaps, e design de contratos que minimizam o valor extraível por front-runners.
Controle de acesso inadequado
Funções administrativas sem restrições de acesso são uma das causas mais comuns de exploits. Use OpenZeppelin AccessControl para gerenciamento de roles, sempre valide msg.sender, e implemente timelocks para operações críticas. Considere usar multisig wallets para funções administrativas.
Oracle manipulation
Contratos que dependem de preços externos são vulneráveis a manipulação de oráculos. Use oráculos decentralizados como Chainlink, implemente TWAPs (Time-Weighted Average Prices) em vez de preços spot, e sempre valide que os dados do oráculo estão frescos (não stale).
Auditoria e testes
Testes unitários com Hardhat ou Foundry são obrigatórios. Use Slither e Mythril para análise estática automatizada. Considere formal verification para contratos críticos. E antes de ir para mainnet, contrate uma auditoria profissional — o custo de uma auditoria é insignificante comparado ao potencial de perda.
Segurança em smart contracts não é uma feature — é um pré-requisito. O ethos “code is law” significa que não há suporte ao cliente para recuperar fundos perdidos.
Tem um projeto em mente?
Somos especialistas em transformar ideias em produtos digitais. Apps, sites, automações e IA — vamos construir juntos.