Perda de Precisão e Exploits de Arredondamento
Contratos inteligentes não precisam de um bug em controle de acesso para perder dinheiro.
Às vezes, o exploit está escondido em uma simples divisão.
Contratos inteligentes financeiros utilizam aritmética de inteiros. Frações são descartadas. Essa direção de arredondamento altera quem recebe o valor. Um erro de uma unidade pode se repetir em milhares de transações.
Em um protocolo financeiro, o arredondamento é uma política de transferência de valor.
Toda divisão deve responder a três perguntas:
- Em qual direção o cálculo arredonda?
- Qual parte se beneficia dessa direção?
- Um atacante pode repetir ou amplificar essa vantagem?
Erros matemáticos comuns incluem:
Dividir cedo demais Se você dividir antes de multiplicar, perderá precisão. Exemplo: (amount / 1e18) * rate. A divisão intermediária descarta dados antes que a multiplicação ocorra. Regra: Sempre multiplique antes de dividir.
Overflows intermediários Multiplicar primeiro pode causar um overflow mesmo que o resultado final caiba em um uint256. Use uma biblioteca como OpenZeppelin Math para realizar multiplicação e divisão de precisão total em uma única etapa.
Arredondamento na direção errada Arredondamento não é uma sugestão. É uma regra de segurança. Um protocolo conservador segue estes princípios:
- Arredonde a dívida para cima.
- Arredonde os pagamentos exigidos para cima.
- Arredonde o valor do colateral para baixo.
- Arredonde os ativos pagos aos usuários para baixo.
- Arredonde as cotas cobradas dos usuários para cima.
Quando um resultado exato for impossível, arredonde contra a parte que tenta extrair valor.
Ataques de inflação Em cofres com baixa liquidez, atacantes podem usar doações para manipular taxas de câmbio. Eles doam ativos para aumentar a contagem total de ativos sem aumentar a contagem de cotas. Isso faz com que novos depósitos arredondem para baixo, resultando em zero cotas. Mitigação: Use ativos ou cotas virtuais para estabelecer uma taxa inicial estável.
Ataques de frequência Se os juros acumularem a cada bloco e arredondarem para baixo, um atacante pode disparar o acúmulo constantemente para manter os juros em zero. Mitigação: Use um índice de alta precisão ou carregue o resto para frente.
A engenharia financeira segura requer:
- Unidades e escalas decimais explícitas.
- Multiplicação e divisão de precisão total.
- Arredondamento específico para a operação.
- Rastreamento de restos.
- Testes de invariantes e fuzz testing.
Não pergunte apenas se um cálculo é próximo o suficiente. Pergunte para onde vai o valor descartado e quem o recebe.
Fonte: https://dev.to/stablenaira/precision-loss-and-rounding-exploits-in-financial-smart-contracts-4c93