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/WTFSolidity
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
selfdestruct
em contratos pode gerar problemas de segurança e confiança. A funçãoselfdestruct
em um contrato abre vetores de ataque para invasores, como transferir tokens repetidamente para um contrato usandoselfdestruct
para 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.