¿Qué es selfdestruct en Solidity?
Escrito por John Favole
Actualización: Selfdestruct quedó obsoleto durante la actualización Shanghai de Ethereum, según lo establecido por EIP-6049. Este artículo ya está desactualizado y solo refleja cómo funcionaba esta función anteriormente.
Selfdestruct es una palabra clave en Solidity que se usaba cuando los desarrolladores querían terminar un contrato. En un artículo de investigación de 2021, "Why Do Smart Contracts Self-Destruct? Investigating the Selfdestruct Function on Ethereum", cerca de 800 contratos incluían la palabra clave selfdestruct, lo que la convierte en un concepto importante de entender al estudiar Solidity.
Este artículo define qué era selfdestruct, describe su propósito, y presenta un ejemplo de cómo implementar selfdestruct en un contrato inteligente de Solidity.
¿Qué es selfdestruct?
Selfdestruct era una palabra clave que se usaba para terminar un contrato, eliminar el bytecode de la blockchain de Ethereum, y enviar los fondos del contrato a una dirección especificada.
Selfdestruct se originó en 2016, cuando la blockchain de Ethereum y las organizaciones descentralizadas (DAOs) estaban en sus etapas formativas. Una de las primeras DAOs perdió 3.6 millones de ETH en un hackeo. El ataque continuó por varios días debido a la inmutabilidad de los contratos de Solidity. Como en ese momento no existía una manera de destruir un contrato, los primeros desarrolladores de la DAO bifurcaron toda la blockchain para prevenir más ataques.
Por eso se creó selfdestruct, para funcionar como una puerta de salida en caso de amenazas de seguridad. Aunque al principio se le llamó "función suicide", pasó a llamarse selfdestruct a partir de Solidity v0.5.0.
¿Por qué los desarrolladores usaban la función selfdestruct?
Los desarrolladores usaban la función selfdestruct principalmente para mejorar la seguridad del código de los contratos inteligentes, eliminar contratos sin uso, y transferir activos de Ethereum rápidamente.
Selfdestruct era útil cuando los desarrolladores necesitaban actualizar contratos inteligentes. Por ejemplo, el estándar ERC-20 es la implementación estándar para todos los tokens fungibles en Ethereum, con el propósito de garantizar la interoperabilidad. Cualquier token que no se adapte al estándar ERC-20 tendrá dificultades para interactuar con otros contratos.
En estos casos, los desarrolladores optaban por cambiar a un nuevo contrato en lugar de actualizar el contrato actual. Para esto, podían usar la función selfdestruct para extraer los fondos del contrato actual y crear un nuevo contrato con las funcionalidades requeridas.
Los desarrolladores también usaban la función selfdestruct para protegerse contra posibles amenazas de seguridad. Según el mismo informe de 2021 sobre contratos inteligentes con selfdestruct, cuando los desarrolladores encuentran fallas de seguridad en sus contratos, la función selfdestruct les permite terminar de inmediato el contrato defectuoso y reemplazarlo por uno seguro.
¿Cuáles eran las desventajas de usar selfdestruct?
Las desventajas de la función selfdestruct eran su incapacidad de recuperar tokens ERC-20, y su incapacidad de redirigir tokens después de la autodestrucción.
Por lo general, la función selfdestruct era invocada por desarrolladores que no comunicaban a tiempo la terminación de un contrato. Incluso cuando un equipo comunicaba la actualización, la información podía no difundirse con la suficiente rapidez. Como resultado, algunas personas podían terminar enviando fondos al contrato destruido pensando que aún estaba activo. En esos casos, los fondos se perdían.
La segunda desventaja de usar selfdestruct es que solo podía transferir Ether (ETH) y no otros tokens ERC-20, como altcoins o NFTs que siguen el estándar de token ERC-721. Una vez que se invocaba selfdestruct, estos activos nunca podían recuperarse.
¿Por qué algunos consideraban peligrosa la función selfdestruct?
La función selfdestruct facilitaba que desarrolladores malintencionados ejecutaran rug pulls.
La función hacía posible que los desarrolladores invocaran selfdestruct y dirigieran los fondos a sus billeteras personales. Por esta razón, algunos usuarios y desarrolladores de protocolos han expresado opiniones encontradas sobre el uso de la función selfdestruct.
¿Cómo funcionaba selfdestruct?
Selfdestruct funcionaba borrando el bytecode del contrato de la cadena, enviando la liquidez a una dirección especificada, y luego reembolsando una parte de las tarifas de gas a los desarrolladores.
Un contrato consta de dos componentes: estado y funciones. Estos componentes definen el comportamiento del contrato y las funciones invocables. Eliminar el bytecode significa que el contrato ya no tiene los componentes que lo definen, dejándolo inutilizable.
La función selfdestruct tenía un parámetro obligatorio que indicaba a dónde quería el llamador que fueran los fondos del contrato tras la destrucción.
¿Qué es el gas negativo y por qué es relevante?
El gas negativo se refiere a la parte de la tarifa de transacción que la cadena de Ethereum reembolsaba cada vez que los desarrolladores usaban la función selfdestruct.
Ethereum incentivaba el uso de la función selfdestruct recompensando al llamador con el ahorro de gas generado al eliminar los datos de la blockchain. Cuando un contrato invocaba la función selfdestruct, se reembolsaba al llamador la mitad del gas total usado en la transacción.
¿Selfdestruct eliminaba el historial del contrato en la blockchain de Ethereum?
No, la función selfdestruct no eliminaba el historial de un contrato de la cadena de Ethereum; solo eliminaba el bytecode del contrato.
Ethereum es una blockchain, un libro contable público, donde una red de nodos interconectados siempre mantiene una copia del estado de la blockchain. Por lo tanto, todos los datos y transacciones realizados antes de invocar la función selfdestruct quedan registrados permanentemente onchain y no se pueden alterar.
¿Se perdían los fondos de forma permanente al invocar la función selfdestruct?
No y sí: el ETH existente se enviaba a otra dirección especificada por quien invocaba la función, mientras que los tokens ERC-20 se perdían.
Además, si alguien enviaba fondos a un contrato ya autodestruido (es decir, terminado), estos no se redirigían y se perdían.
Ejemplo de la función selfdestruct
El objetivo de este programa es permitir la acuñación de NFTs hasta alcanzar cierta cantidad de ETH en el contrato. Una vez alcanzada, el programa envía todo el Ether a la billetera de quien realizó la última acuñación, como bonificación. Cada persona puede acuñar múltiples NFTs con 1 Ether, pero solo uno a la vez. Este contrato no está pensado para usarse en producción; es solo un ejemplo.
El principal problema del contrato de acuñación es que usa "this.balance" para verificar si el contrato tiene los fondos suficientes para activar la cláusula final. Por eso, un atacante puede enviar fácilmente una cantidad que haga que el contrato supere el límite especificado, y luego usar la palabra clave selfdestruct para redirigir los fondos a su constructor declarado.
Por lo tanto, al usar selfdestruct, los desarrolladores debían tener cuidado con las variables que usaban para satisfacer condiciones específicas. Deben evitar usar referencias a direcciones de contratos o a los fondos del contrato, ya que pueden manipularse de forma artificial.
Cómo usar la función selfdestruct
Inicializar una función selfdestruct es simple: hay que usar la palabra clave selfdestruct dentro de una función y especificar una dirección payable que pueda recibir los fondos del contrato después de invocarla.
Aquí hay un ejemplo de una función selfdestruct típico de lo que se enseña en un curso de Solidity:
Esto es lo que hace el código:
- El nombre de la función es destroy
- El parámetro especifica la dirección como apocalypse
- Cuando se invoca la función destroy, la dirección se especifica mediante la variable apocalypse
- La visibilidad de la función se declara como public, para que otros contratos puedan acceder a ella.
- Luego se usa la palabra clave selfdestruct y se pasa la variable apocalypse tras declararla como payable.
Ahora bien, como la función es pública, representa una posible falla de seguridad. Para contrarrestar esto, se puede considerar agregar un modificador onlyOwner o usar una instrucción require para confirmar que solo el propietario pueda invocar la función destroy.
Aprende Solidity y la función selfdestruct con el curso de desarrollador de Solidity de Alchemy
Selfdestruct funcionaba como un mecanismo de seguridad para terminar un contrato durante brechas de seguridad, cuando los desarrolladores querían actualizar contratos, o para eliminar contratos antiguos. Aunque el uso de selfdestruct sigue siendo debatido en la comunidad de desarrolladores de Solidity, la introducción de esta función ayudó a proteger contra muchos posibles hackeos.
Puedes aprender más sobre funciones importantes como selfdestruct y convertirte en un mejor desarrollador de Solidity inscribiéndote en el bootcamp gratuito de Ethereum de 7 semanas de Alchemy University. Si eres nuevo en el desarrollo en general, el curso intensivo de JavaScript de 3 semanas de Alchemy es un excelente prerrequisito antes de comenzar un bootcamp de Ethereum.
Resúmenes relacionados
Solidity3 de diciembre de 2025
Los 6 mejores IDEs de Solidity para desarrolladores (2026)
Explora los mejores IDEs para el desarrollo en Solidity.
Solidity19 de noviembre de 2025
Optimización de gas en Solidity: 12 técnicas para hacer tus smart contracts más económicos y eficientes
¿Quieres escribir mejor código y reducir tus fees de gas?
Solidity13 de noviembre de 2025
12 mejores prácticas de seguridad para smart contracts en Solidity
Protege tus smart contracts con estos consejos y herramientas de seguridad de expertos.

Construye magia blockchain
Alchemy combina los productos y herramientas de desarrollo Web3 más potentes con recursos, comunidad y un soporte legendario.