---
title: "O que é selfdestruct em Solidity?"
description: "O que é, como funciona e como começar"
---

# O que é selfdestruct em Solidity?

**Atualização**: O selfdestruct foi descontinuado durante o upgrade Shanghai do Ethereum, conforme previsto pela [EIP-6049](https://eips.ethereum.org/EIPS/eip-6049). Este artigo está desatualizado e reflete apenas como o recurso funcionava anteriormente.

_Selfdestruct_ é uma palavra-chave em [Solidity](https://www.alchemy.com/overviews/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](https://www.alchemy.com/overviews/learn-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](https://www.alchemy.com/dapps/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](https://www.alchemy.com/dapps/top/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](https://www.alchemy.com/overviews/erc20-solidity) é 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](https://arxiv.org/pdf/2005.07908.pdf#:~:text=On%20the%20one%20hand%2C%20using,an%20attack%20vector%20for%20attackers), 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](https://www.alchemy.com/overviews/solidity-functions). 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](https://www.alchemy.com/overviews/solidity-function-visibility), 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](https://www.alchemy.com/overviews/solidity-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](https://www.alchemy.com/overviews/how-to-become-a-solidity-developer) inscrevendo-se no [bootcamp gratuito de 7 semanas de Ethereum](https://university.alchemy.com/?a=d1bd288312) 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.
