1. Les espaces de stockage de l’EVM

Comprendre la gestion de la mémoire sous Solidity est indispensable pour concevoir du code performant et économe en gaz :

  • Storage : Espace persistant sur la blockchain. Écrire dans le Storage est l’opération la plus coûteuse de l’EVM (jusqu’à 20’000 gas par slot de 32 octets).
  • Memory : Espace mémoire temporaire alloué durant l’exécution de la fonction, effacé dès la fin de l’appel. Modérément coûteux.
  • Calldata : Espace de données immuable contenant les arguments d’entrée d’une fonction externe. C’est l’espace le plus économe en gaz pour passer des tableaux ou des chaînes de caractères.

2. Les modificateurs de fonctions (Function Modifiers)

Les modificateurs permettent d’encapsuler des conditions de contrôle d’accès réutilisables avant ou après l’exécution du corps d’une fonction :

contract GestionnaireAcces {
    address public proprietaire;

    constructor() {
        proprietaire = msg.sender;
    }

    // Modificateur personnalisé
    modifier uniquementProprietaire() {
        require(msg.sender == proprietaire, "Erreur : Seul le proprietaire peut executer cette action");
        _; // Le symbole '_;' indique l'endroit ou le corps de la fonction sera insere
    }

    function reinitialiserSysteme() external uniquementProprietaire {
        // Logique executee uniquement si le require du modifier a reussi
    }
}

3. Bonnes pratiques d’optimisation du gaz (Gas Optimization)

  1. Utiliser immutable et constant : Les variables qui ne changent jamais de valeur après l’initialisation ne sont pas stockées dans le Storage mais directement écrites dans le bytecode du contrat, économisant du gaz à chaque lecture.
  2. Le compactage de variables (Variable Packing) : L’EVM manipule des emplacements (slots) de 32 octets (256 bits). Regroupez consécutivement les types courts (ex: uint128 avec uint128, ou address (20 octets) avec uint96) pour qu’ils partagent le même slot de stockage.
  3. Préférer custom errors aux chaînes require : Depuis Solidity 0.8.4, l’utilisation de revert CustomError() est nettement moins onéreuse en gaz que les longues chaînes de caractères d’erreur.

Conseil d’expert : Sur Ethereum, un contrat mal optimisé peut coûter des dizaines de francs suisses supplémentaires à chaque transaction pour ses utilisateurs. L’optimisation du gaz est un gage de professionnalisme.