O que é selfdestruct em Solidity?
Escrito por John Favole
Atualização: O selfdestruct foi descontinuado durante o upgrade Shanghai do Ethereum, conforme previsto pela EIP-6049. Este artigo está desatualizado e reflete apenas como o recurso funcionava anteriormente.
Selfdestruct é uma palavra-chave em Solidity usada quando desenvolvedores queriam encerrar um contrato. Em um artigo de pesquisa de 2021, "Why Do Smart Contracts Self-Destruct? Investigating the Selfdestruct Function on Ethereum", cerca de 800 contratos incluíam a palavra-chave selfdestruct, tornando-a um conceito importante para entender ao estudar Solidity.
Este artigo define o que era o selfdestruct, descreve seu propósito e apresenta um exemplo de implementação de selfdestruct em um smart contract Solidity.
O que é selfdestruct?
Selfdestruct era uma palavra-chave usada para encerrar um contrato, remover o bytecode da blockchain Ethereum e enviar quaisquer fundos do contrato para um endereço especificado.
Selfdestruct surgiu em 2016, quando a blockchain Ethereum e as organizações descentralizadas (DAOs) estavam em seus estágios iniciais. Uma das primeiras DAOs perdeu 3,6 milhões de ETH em um hack. O ataque continuou por dias devido à imutabilidade dos contratos em Solidity. Como não existia uma forma de destruir um contrato naquela época, os primeiros desenvolvedores de DAOs bifurcaram toda a blockchain para evitar mais explorações.
Assim, o selfdestruct foi criado para servir como uma saída de emergência em caso de ameaças de segurança. Embora inicialmente fosse chamado de "suicide function", ele foi renomeado para selfdestruct a partir do Solidity v0.5.0.
Por que os desenvolvedores usavam a função selfdestruct?
Os desenvolvedores usavam a função selfdestruct principalmente para melhorar a segurança do código do smart contract, limpar contratos não utilizados e transferir ativos em Ethereum rapidamente.
O selfdestruct era útil quando os desenvolvedores precisavam atualizar smart contracts. Por exemplo, o padrão ERC-20 é a implementação padrão para todos os tokens fungíveis no Ethereum, com o propósito de interoperabilidade. Qualquer token que não implemente a interface do padrão ERC-20 terá dificuldade em interagir com outros contratos.
Nesses casos, os desenvolvedores mudam para um novo contrato em vez de atualizar o contrato atual. Assim, eles podiam usar a função selfdestruct para extrair fundos do contrato atual e construir um novo contrato com as funcionalidades necessárias.
Os desenvolvedores também usavam a função selfdestruct para se proteger contra possíveis ameaças de segurança. De acordo com o mesmo relatório de 2021 sobre smart contracts e selfdestruct, quando desenvolvedores encontram falhas de segurança em seus contratos, uma função selfdestruct os ajuda a encerrar imediatamente o contrato com falhas e substituí-lo por um contrato seguro.
Quais são as desvantagens de usar o selfdestruct?
As desvantagens da função selfdestruct eram sua incapacidade de recuperar tokens ERC-20 e sua incapacidade de redirecionar tokens após a autodestruição.
Normalmente, as funções selfdestruct eram chamadas por desenvolvedores que não comunicavam a tempo o encerramento do contrato. Mesmo quando uma equipe comunica a atualização, ela pode não se espalhar rápido o suficiente. Como resultado, algumas pessoas podem acabar enviando fundos para o contrato destruído, pensando que ele ainda está ativo. Nesse caso, os fundos são perdidos.
A segunda desvantagem de usar o selfdestruct é que ele só pode transferir Ether (ETH) e não outros tokens ERC-20, como altcoins ou NFTs, que seguem o padrão de token ERC-721. Uma vez chamado o selfdestruct, esses ativos nunca podem ser recuperados.
Por que algumas pessoas consideravam a função selfdestruct perigosa?
A função selfdestruct facilitava a execução de rug pulls por desenvolvedores mal-intencionados.
A função tornava possível que desenvolvedores chamassem o selfdestruct e direcionassem os fundos para suas carteiras pessoais. Por esse motivo, alguns usuários e desenvolvedores de protocolos expressaram sentimentos ambíguos sobre o uso da função selfdestruct.
Como funciona o selfdestruct?
O selfdestruct funciona apagando o bytecode do contrato da chain, enviando qualquer liquidez para um endereço especificado e, em seguida, reembolsando parte das taxas de gas aos desenvolvedores.
Um contrato consiste em dois componentes: state e functions. Esses componentes definem o comportamento do contrato e as funções que podem ser chamadas. Remover o bytecode significa que o contrato não tem mais componentes que o definam, tornando-o inacessível para chamadas.
A função selfdestruct tinha um parâmetro obrigatório que indicava para onde o autor da chamada queria que os fundos do contrato fossem após a destruição.
O que é gas negativo e por que isso é relevante?
Gas negativo se refere a uma parte da taxa de transação que a chain Ethereum reembolsa sempre que os desenvolvedores usam a função selfdestruct.
O Ethereum incentivava o uso da função selfdestruct recompensando o autor da chamada com a economia de gas gerada pela remoção dos dados da blockchain. Quando um contrato chamava a função selfdestruct, metade do total de gas usado na transação era reembolsada ao autor da chamada.
O selfdestruct remove o histórico do contrato na blockchain Ethereum?
Não, a função selfdestruct não remove o histórico de um contrato da chain Ethereum — ela remove apenas o bytecode do contrato.
Ethereum é uma blockchain, um livro-razão público, no qual uma rede de nós interconectados sempre mantém uma cópia do state da blockchain. Portanto, todos os dados e transações realizados antes de chamar a função selfdestruct são registrados onchain de forma permanente e não podem ser alterados.
Os fundos são perdidos permanentemente após chamar a função selfdestruct?
Não e sim: o ETH existente é enviado para outro endereço especificado por quem chamou a função, enquanto os tokens ERC-20 são perdidos.
Além disso, se alguém enviar fundos para um contrato que sofreu selfdestruct (ou seja, um contrato encerrado), esses fundos não serão redirecionados e serão perdidos.
Exemplo da função selfdestruct
O objetivo deste programa é permitir a cunhagem de NFTs até que uma determinada quantidade de ETH no contrato seja atingida. Uma vez atingida, o programa envia todo o Ether para a carteira do último minter como bônus. Cada pessoa pode cunhar múltiplos NFTs com 1 Ether, mas apenas um por vez. Este contrato não deve ser usado em produção, é apenas para fins de exemplo.
O principal problema do contrato de mint é que ele usa "this.balance" para verificar se o contrato tem fundos suficientes ou não para acionar a cláusula final. Assim, o atacante pode facilmente enviar uma quantia para empurrar o contrato além do limite especificado e depois usar a palavra-chave selfdestruct para redirecionar os fundos para o construtor que declarou.
Portanto, ao usar selfdestruct, os desenvolvedores precisam ter cuidado com as variáveis usadas para satisfazer condições específicas. Evite usar qualquer referência a endereços de contrato ou aos fundos do contrato, pois eles podem ser manipulados artificialmente.
Como usar a função selfdestruct
Inicializar uma função selfdestruct é simples: você precisa usar a palavra-chave selfdestruct dentro de uma função e especificar um endereço payable que possa receber os fundos do contrato após a chamada da função selfdestruct.
Aqui está um exemplo de uma função selfdestruct tipicamente ensinada em um curso de Solidity:
Isto é o que o código faz:
- O nome da função é destroy
- O parâmetro especifica o endereço como apocalypse
- Quando a função destroy é chamada, o endereço é especificado por meio da variável apocalypse
- A visibilidade da função é declarada como public, para que outros contratos possam acessá-la.
- Em seguida, usamos a palavra-chave selfdestruct e passamos a variável apocalypse depois de declará-la como payable.
Agora, como a função é public, ela representa uma potencial falha de segurança. Para contornar isso, você pode considerar adicionar um modifier onlyOwner ou usar uma instrução require para confirmar que apenas o owner pode chamar a função destroy.
Aprenda Solidity e a função selfdestruct com o curso de desenvolvimento Solidity da Alchemy
Selfdestruct atuava como um mecanismo de segurança para encerrar um contrato durante violações de segurança, quando desenvolvedores queriam atualizar contratos, ou para remover contratos antigos. Embora o uso do selfdestruct ainda seja debatido na comunidade de desenvolvedores Solidity, a introdução da função ajudou a proteger contra muitos hacks em potencial.
Você pode aprender mais sobre funções importantes como selfdestruct e se tornar um desenvolvedor Solidity melhor inscrevendo-se no bootcamp gratuito de 7 semanas de Ethereum da Alchemy University. Se os desenvolvedores forem novos no desenvolvimento em geral, o curso intensivo de 3 semanas de JavaScript da Alchemy é um ótimo pré-requisito antes de começar um bootcamp de Ethereum.
Visões gerais relacionadas
Solidity3 de dezembro de 2025
As 6 melhores IDEs de Solidity para desenvolvedores (2026)
Conheça as melhores IDEs para desenvolvimento em Solidity.
Solidity19 de novembro de 2025
Otimização de gas em Solidity: 12 técnicas para deixar seus smart contracts mais baratos e eficientes
Quer escrever código melhor e reduzir suas taxas de gas?
Solidity13 de novembro de 2025
12 boas práticas de segurança para smart contracts em Solidity
Proteja seus smart contracts com essas dicas e ferramentas de segurança de especialistas.

Construa magia blockchain
A Alchemy combina os produtos e ferramentas de desenvolvimento Web3 mais poderosos com recursos, comunidade e suporte lendário.