
"Ei, cara, eu ouvi recentemente sobre Ataques de Reentrância, mas não tenho ideia do que é. O que é isso, cara?"
Cara, imagine que você vai a um banco onde o caixa é extremamente lento e tem perda de memória de curto prazo.
Você se aproxima e diz: "Eu gostaria de retirar $100."

O caixa verifica seu livro, vê que você tem $100, abre a gaveta e lhe entrega o dinheiro.
MAS, estritamente antes de ele pegar a caneta para atualizar seu saldo para $0, você o interrompe e grita:

"Na verdade, eu gostaria de retirar $100!"
Ele olha para o livro. Como ele ainda não escreveu nada, o livro ainda diz que você tem $100. Então ele lhe entrega mais $100.

Você continua interrompendo-o antes que ele possa escrever, drenando todo o cofre do banco, enquanto o saldo da sua conta no papel permanece perfeito.
Esse "Glitch do Dinheiro Infinito" é um Ataque de Reentrância.

Em um Contrato Inteligente, o código geralmente faz duas coisas quando você retira:
Envie o Dinheiro (Entregue o dinheiro).
Atualize o Livro (Subtraia o valor do seu saldo).
Se o desenvolvedor escrever o código nessa ordem exata (Enviar -> Atualizar), eles estão condenados.
Um atacante escreve um contrato malicioso que automaticamente grita "Retire novamente!" no milissegundo em que recebe o dinheiro. Como o contrato principal ainda não chegou à etapa 2 (Atualizar Livro), ele pensa que o usuário ainda tem fundos e envia o dinheiro novamente. Ele repete esse processo até que o contrato esteja vazio.
Ok, mas como isso realmente funciona?
Aqui estão alguns detalhes que não se encaixaram na analogia simples:

A Função de Fallback: A "Interrupção" acontece por causa de um recurso especial em Solidity chamado função fallback(). Quando o Contrato Vítima envia ETH para o Contrato Atacante, a função fallback() do Atacante é acionada automaticamente. O atacante oculta o comando "Retire Novamente" dentro dessa função.
A Correção (Verificações-Efeitos-Interações): A maneira de parar isso é simples, mas fácil de esquecer. Você deve atualizar o livro antes de enviar o dinheiro. Se o caixa escrever "-$100" no livro antes de abrir a gaveta de dinheiro, o ataque falha. Isso é chamado de padrão "Verificações-Efeitos-Interações".

Este é o hack específico que matou "The DAO" em 2016 (o primeiro grande fundo de criptomoeda). Foi tão ruim (US$ 60 milhões roubados) que o Ethereum teve que "hard fork" (já discutimos sobre isso) para consertá-lo, que é por isso que temos Ethereum (ETH) e Ethereum Classic (ETC) hoje. É o avô de todos os exploits de contratos inteligentes.



