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.