Delegatecall

Solidity

Définition

Appel bas niveau qui exécute le code d'un autre contrat dans le contexte du contrat appelant. Le storage, msg.sender et msg.value restent ceux de l'appelant. Mécanisme fondamental des proxies upgradables (EIP-1967). DANGER : peut écraser votre storage si les layouts ne correspondent pas. Ne préserve pas le gas restant par défaut.

Version anglaise

Low-level call that executes another contract's code in the calling contract's context. Storage, msg.sender and msg.value remain those of the caller. Fundamental mechanism for upgradable proxies (EIP-1967). DANGER: can overwrite your storage if layouts don't match. Does not preserve remaining gas by default.

Exemple de Code

contract Proxy {
  address public implementation;

  fallback() external payable {
    address impl = implementation;
    assembly {
      calldatacopy(0, 0, calldatasize())
      let result := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)
      returndatacopy(0, 0, returndatasize())
      switch result
      case 0 { revert(0, returndatasize()) }
      default { return(0, returndatasize()) }
    }
  }
}

Termes Liés

Pratique ce concept sur Solingo

Maîtrise Delegatecall avec des exercices interactifs et un IDE intégré.

Commencer gratuitement