Eu recentemente tenho revisitado o estudo da Solidity para consolidar alguns detalhes e estou escrevendo uma série chamada "WTF Introdução Simples à Solidity" para iniciantes (programadores mais avançados podem procurar outros tutoriais). Atualizo com 1-3 lições por semana.
Twitter: @0xAA_Science
Comunidade: Discord | Grupo no WeChat | Site oficial wtf.academy
Todo o código e tutoriais estão disponíveis no GitHub: github.com/AmazingAng/WTF-Solidity
O comando selfdestruct pode ser utilizado para excluir contratos inteligentes e transferir o restante de ETH do contrato para um endereço específico. O selfdestruct foi originalmente chamado de suicide (suicídio), mas devido à sensibilidade do termo, foi renomeado para selfdestruct. Na versão v0.8.18 do Solidity, a palavra-chave selfdestruct foi marcada como "não recomendada", pois em alguns casos pode resultar em semântica de contrato inesperada. No entanto, como ainda não há uma alternativa, por enquanto, apenas um aviso de compilação foi adicionado aos desenvolvedores. Mais informações podem ser encontradas em EIP-6049.
O uso de selfdestruct é bastante simples:
selfdestruct(_addr);Onde _addr é o endereço que receberá o restante de ETH do contrato. O endereço _addr não precisa ter funções receive() ou fallback() para receber ETH.
contract DeleteContract {
uint public value = 10;
constructor() payable {}
receive() external payable {}
function deleteContract() external {
// Chamando selfdestruct para destruir o contrato e transferir o ETH restante para msg.sender
selfdestruct(payable(msg.sender));
}
function getBalance() external view returns(uint balance){
balance = address(this).balance;
}
}No contrato DeleteContract, temos uma variável de estado public chamada value, duas funções: getBalance() para obter o saldo do contrato em ETH e deleteContract() para autodestruir o contrato e transferir o ETH para o iniciador da ação.
Após implantar o contrato, transferimos 1 ETH para o contrato. Neste momento, getBalance() retornará 1 ETH e o valor value será 10.
Quando chamamos a função deleteContract(), o contrato é destruído e qualquer interação com as funções do contrato resultará em erro.
- Ao fornecer uma interface para destruir o contrato, é melhor limitar o acesso apenas ao proprietário do contrato, o que pode ser feito com modificadores de função como
onlyOwner. - Após a destruição do contrato, qualquer tentativa de interagir com funções do contrato resultará em erro.
- O uso frequente da funcionalidade
selfdestructem contratos pode gerar problemas de segurança e confiança. A funçãoselfdestructem um contrato abre vetores de ataque para invasores, como transferir tokens repetidamente para um contrato usandoselfdestructpara economizar muito em taxas de GAS. Embora poucas pessoas façam isso, essa funcionalidade mina a confiança dos usuários no contrato.
-
Implantar o contrato e transferir 1 ETH, verifique o estado do contrato
-
Destruir o contrato, verifique o estado do contrato
Observando o estado do contrato durante o teste, podemos ver que após a exclusão do contrato, o ETH é transferido para o endereço especificado. Qualquer tentativa de interagir com o contrato após a exclusão resultará em falha.
selfdestruct é o botão de emergência dos contratos inteligentes, permitindo a destruição do contrato e a transferência do ETH restante para um endereço específico. Certamente, os fundadores do Ethereum devem ter se arrependido de não ter incluído selfdestruct no contrato do The DAO para interromper o ataque dos hackers.

