Quero compartilhar algo bastante importante que talvez você ainda não compreenda completamente - que é a vulnerabilidade de reentrancy em contratos inteligentes. Se você está a desenvolver dapp ou a trabalhar com blockchain, isto é um conhecimento obrigatório.



Qual é o problema básico da reentrancy? Acontece quando um contrato inteligente chama outro contrato, e esse contrato pode fazer uma chamada de volta ao contrato original enquanto ainda está em execução. Um atacante pode explorar esse período para roubar fundos.

Imagine que o ContractA tem 10 Ether e o ContractB enviou 1 Ether para ele. Quando o ContractB chama a função de retirada, o ContractA verifica se o saldo é maior que 0, e se for, envia Ether de volta. Mas aqui está o problema - o ContractA só atualiza o saldo após enviar o dinheiro. Assim, durante o envio, se o ContractB tiver uma função fallback, ela pode chamar novamente a função de retirada do ContractA. Como o saldo ainda não foi atualizado, a verificação passa novamente, e ele recebe mais 1 Ether. Esse ciclo continua até que o ContractA fique sem fundos.

Vou mostrar três maneiras de proteger o contrato contra esse ataque de reentrancy.

A primeira é usar o modificador nonReentrant. A ideia é bem simples - você bloqueia o contrato enquanto a função está em execução. Se alguém tentar chamar novamente essa função, a chamada será rejeitada porque o contrato está bloqueado. Você deve liberar o bloqueio somente após a execução completa, e aí a verificação falhará se tentar reentrar.

A segunda é usar o padrão Checks-Effects-Interactions. Em vez de atualizar o saldo após enviar o dinheiro, você atualiza imediatamente após a verificação, mas antes de fazer a transferência. Assim, mesmo que outro contrato chame de volta, o saldo já estará zerado, e a verificação falhará. Por isso, a ordem é muito importante - verificar primeiro, depois aplicar efeitos, e por último interagir com outros contratos.

A terceira é criar um guard global de reentrancy, especialmente útil quando você tem múltiplos contratos interagindo entre si. Em vez de proteger cada função individualmente, você cria um contrato de guarda comum, que armazena o estado de bloqueio em um local central. Quando qualquer contrato tenta executar uma função protegida, ela verifica com esse guard. Se o guard indicar que o contrato está bloqueado, a transação é rejeitada. Essa abordagem é poderosa porque impede reentrancy não só dentro de um contrato, mas também entre vários contratos.

Recomendo aplicar todas as três técnicas conforme a situação. Para funções de retirada ou transferência de ativos, sempre use nonReentrant ou Checks-Effects-Interactions. E, se seu projeto tiver um sistema complexo de contratos, considere usar um GlobalReentrancyGuard como uma camada adicional de proteção.

Essa vulnerabilidade é uma das mais comuns e causa perdas financeiras significativas, portanto, entender bem o reentrancy é fundamental se você deseja escrever contratos inteligentes seguros.
XCH17,35%
TRA0,63%
XEM1,92%
Ver original
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
  • Recompensa
  • Comentar
  • Republicar
  • Partilhar
Comentar
Adicionar um comentário
Adicionar um comentário
Nenhum comentário
  • Fixado