Selfdestruct: Impacto y alternativas modernas
El selfdestruct quedó obsoleto durante la actualización de Ethereum Shanghái (12/04/2023), tal y como se pedía en el EIP-6049.
La función selfdestruct
tuvo un impacto significativo en el desarrollo de smart contracts, aunque ahora ha sido reemplazada por nuevas prácticas.
En esta entrada, repasaremos qué era selfdestruct
, su funcionamiento, y las alternativas actuales que han evolucionado para asumir su papel.
¿Qué era selfdestruct
?
selfdestruct
era una función en Solidity que permitía eliminar un smart contract, pero no de manera completa.
Al invocar selfdestruct
, se producía lo siguiente:
-
Eliminación del Bytecode: La función eliminaba el bytecode del contrato de la blockchain. Esto significa que el contrato ya no podía ser ejecutado ni recibir interacciones a través de nuevas transacciones.
-
Transferencia de Fondos: Antes de la eliminación del bytecode,
selfdestruct
permitía transferir cualquier Ether restante en el contrato a una dirección especificada. Esto aseguraba que los fondos no se perdieran tras la destrucción del contrato.
A pesar de la eliminación del bytecode, los registros de transacciones y eventos asociados con el contrato permanecían en la blockchain. El historial completo de interacciones con el contrato seguía siendo accesible y auditable.
Funcionamiento de selfdestruct
pragma solidity ^0.8.0;
contract SimpleContract {
address payable owner;
constructor() {
owner = payable(msg.sender);
}
function destroy() public {
require(msg.sender == owner, "Only owner");
selfdestruct(owner);
}
}
En este ejemplo, el contrato SimpleContract incluía una función destroy que, al ser llamada por el propietario, ejecutaba selfdestruct
.
Esto eliminaba el contrato de la blockchain y transfería cualquier Ether restante a la dirección del propietario.
Riesgos y Desventajas
- Irreversibilidad: Una vez ejecutada, la acción no podía deshacerse. Todo el código y los datos se perdían permanentemente.
- Seguridad: Si un contrato incluía
selfdestruct
, un atacante podría potencialmente destruir el contrato y robar los fondos, si tenía acceso a esa función.
Alternativas Actuales
Con la eliminación de selfdestruct
, se han desarrollado enfoques más modernos para manejar contratos que deben ser eliminados o reemplazados. Algunas alternativas incluyen:
- Uso de contratos Proxy: Los contratos proxy permiten la actualización de la lógica del contrato sin perder el estado. El contrato lógico puede ser reemplazado por uno nuevo, manteniendo el estado y los fondos en el contrato proxy.
- Patrones de contrato modular: Utilizar contratos modulares permite actualizar o reemplazar módulos específicos del contrato, evitando la necesidad de eliminar el contrato completo.
- Manejo seguro de fondos: La implementación de mecanismos de control de acceso para prevenir el uso indebido.