9.3 Uso de delegatecall





Curso de Solidity: Uso de delegatecall

9.3 Uso de delegatecall en Solidity

En Solidity, delegatecall es una funcionalidad avanzada que permite que un contrato llame a otro contrato y ejecute su código en el contexto del contrato llamador. Esto significa que el storage (almacenamiento) y el contexto de mensaje (msg.sender, msg.value) se mantienen en el contrato llamador.

¿Qué es delegatecall

delegatecall permite a un contrato reutilizar el código de otro contrato sin cambiar su contexto. Esta funcionalidad es especialmente útil en el diseño de contratos más modulables y actualizables como los contratos proxy o las contract libraries.

Ventajas:

  • Reutilización de código.
  • Facilitar la actualización de contratos.
  • Mantener un código más limpio y modular.

Desventajas:

  • Peligro de sobreescribir el almacenamiento del contrato llamador.
  • Complejidad adicional en el diseño y depuración.

Funcionamiento Interno

Cuando usas delegatecall, el código del contrato llamado se ejecuta con el almacenamiento, estado y contexto de mensaje del contrato llamador. Así, cualquier modificación en el estado se realizará en el contrato llamador, no en el contrato llamado.

Ejemplo Práctico

Supongamos que tenemos dos contratos: el contrato Logic y el contrato Proxy. El contrato Proxy utilizará delegatecall para invocar funciones del contrato Logic.

Contrato Logic

    pragma solidity ^0.8.0

    contract Logic {
        uint256 public number

        function setNumber(uint256 _number) public {
            number = _number
        }
    }
    

Contrato Proxy

    pragma solidity ^0.8.0

    contract Proxy {
        uint256 public number

        address public logicContract

        constructor(address _logicContract) {
            logicContract = _logicContract
        }

        fallback() external payable {
            (bool success, bytes memory data) = logicContract.delegatecall(msg.data)
            require(success, delegatecall failed)
        }
    }
    

En este ejemplo:

  • El contrato Logic contiene una única función setNumber que modifica el estado de la variable number.
  • El contrato Proxy almacena la dirección del contrato Logic y utiliza la función fallback para delegar todas las llamadas a dicho contrato.
  • Cuando llamamos a cualquier función en el contrato Proxy, se utiliza delegatecall para ejecutar el código del contrato Logic en el contexto del almacenamiento del contrato Proxy.

Consideraciones de Seguridad

El uso de delegatecall puede introducir riesgos de seguridad, como cambios no intencionados en el almacenamiento del contrato llamador. Por ello, es esencial tener en cuenta:

  • Verificar el contrato llamado para asegurar que no se modifiquen variables no deseadas.
  • Planificar y documentar cuidadosamente el diseño del almacenamiento.
  • Auditar y probar exhaustivamente el contrato para evitar vulnerabilidades.

Con estas precauciones, delegatecall puede ser una herramienta poderosa para crear contratos inteligentes más modulares y eficientes en Solidity.


AnteriorSiguiente

[mwai_chat]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *