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
Logiccontiene una única funciónsetNumberque modifica el estado de la variablenumber. - El contrato
Proxyalmacena la dirección del contratoLogicy utiliza la funciónfallbackpara delegar todas las llamadas a dicho contrato. - Cuando llamamos a cualquier función en el contrato
Proxy, se utilizadelegatecallpara ejecutar el código del contratoLogicen el contexto del almacenamiento del contratoProxy.
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.

Deja una respuesta