Guide de pratique pour l'optimisation du Gas des smart contracts Ethereum

Guide pratique d'optimisation des Gas pour les smart contracts Ethereum

Les frais de Gas sur le réseau Ethereum ont toujours été un problème commun pour les développeurs et les utilisateurs, surtout en période de congestion du réseau. Lors des pics, les utilisateurs doivent souvent payer des frais de transaction très élevés. Par conséquent, il est crucial d'optimiser les frais de Gas lors de la phase de développement des smart contracts. L'optimisation de la consommation de Gas peut non seulement réduire efficacement les coûts de transaction, mais également améliorer l'efficacité des transactions, offrant aux utilisateurs une expérience d'utilisation de la blockchain plus économique et efficace.

Cet article présentera le mécanisme des frais de Gas de la machine virtuelle Ethereum (EVM), les concepts clés liés à l'optimisation des frais de Gas, ainsi que les meilleures pratiques pour optimiser les frais de Gas lors du développement de smart contracts. J'espère que ces contenus pourront inspirer et aider les développeurs, tout en permettant aux utilisateurs ordinaires de mieux comprendre le fonctionnement des frais de Gas de l'EVM, afin de faire face ensemble aux défis de l'écosystème blockchain.

Gas optimisation des 10 meilleures pratiques pour les contrats intelligents Ethereum

Introduction au mécanisme des frais de Gas de l'EVM

Dans les réseaux compatibles avec EVM, le "Gas" est l'unité utilisée pour mesurer la puissance de calcul nécessaire à l'exécution d'opérations spécifiques.

Dans la structure de l'EVM, la consommation de Gas se divise en trois parties : l'exécution des opérations, les appels de messages externes et la lecture/écriture de la mémoire et du stockage.

Étant donné que l'exécution de chaque transaction nécessite des ressources de calcul, des frais seront donc facturés pour empêcher les boucles infinies et les attaques de déni de service (DoS). Les frais nécessaires pour compléter une transaction sont appelés "frais de Gas".

Depuis l'activation de la fourche dure de Londres EIP-1559(), les frais de Gas sont calculés selon la formule suivante :

Frais de gaz = unités de gaz utilisées * (frais de base + frais de priorité)

Les frais de base seront brûlés, tandis que les frais prioritaires serviront d'incitation pour encourager les validateurs à ajouter des transactions à la blockchain. En fixant des frais prioritaires plus élevés lors de l'envoi d'une transaction, cela peut augmenter la probabilité que la transaction soit incluse dans le prochain bloc. Cela ressemble à un "pourboire" que l'utilisateur paie au validateur.

Ethereum smart contracts Gas optimisation des dix meilleures pratiques

1. Comprendre l'optimisation du Gas dans l'EVM

Lorsque vous compilez des smart contracts avec Solidity, le contrat est converti en une série de "codes d'opération", c'est-à-dire des opcodes.

Toute instruction d'opération (, telle que la création de contrats, l'appel de messages, l'accès au stockage de comptes et l'exécution d'opérations sur une machine virtuelle ), a un coût de consommation de Gas reconnu, ces coûts sont enregistrés dans le livre jaune d'Ethereum.

Après plusieurs modifications des EIP, certains coûts en Gas des codes d'opération ont été ajustés, ce qui peut différer de ceux du livre jaune.

2.Concept de base de l'optimisation des gaz

Le principe central de l'optimisation du Gas est de privilégier les opérations à coût d'efficacité élevé sur la blockchain EVM, en évitant les opérations coûteuses en Gas.

Dans l'EVM, les opérations suivantes ont un coût relativement bas :

  • Lire et écrire des variables en mémoire
  • Lire des constantes et des variables immuables
  • Lire et écrire des variables locales
  • Lire la variable calldata, par exemple le tableau et la structure de calldata.
  • Appel de fonction interne

Les opérations à coût élevé comprennent :

  • Lire et écrire des variables d'état stockées dans le stockage des contrats
  • Appel de fonction externe
  • Opération en boucle

Optimisation des Gas pour les smart contracts Ethereum : les dix meilleures pratiques

Meilleures pratiques d'optimisation des frais de gaz EVM

Sur la base des concepts fondamentaux ci-dessus, nous avons compilé une liste des meilleures pratiques d'optimisation des frais de Gas pour la communauté des développeurs. En suivant ces pratiques, les développeurs peuvent réduire la consommation de Gas de leurs smart contracts, diminuer les coûts de transaction et créer des applications plus efficaces et conviviales.

1. Essayez de réduire au minimum l'utilisation du stockage.

Dans Solidity, le stockage( est une ressource limitée, dont la consommation de Gaz est bien supérieure à celle de la mémoire). Chaque fois qu'un smart contract lit ou écrit des données depuis le stockage, des coûts de Gaz élevés sont engendrés.

Selon la définition du livre jaune d'Ethereum, le coût des opérations de stockage est plus de 100 fois supérieur à celui des opérations en mémoire. Par exemple, les instructions OPcodes mload et mstore ne consomment que 3 unités de Gas, tandis que les opérations de stockage telles que sload et sstore nécessitent au moins 100 unités, même dans les meilleures conditions.

Les méthodes pour limiter l'utilisation du stockage incluent :

  • Stocker des données non permanentes en mémoire
  • Réduire le nombre de modifications de stockage : en sauvegardant les résultats intermédiaires en mémoire et en attribuant ensuite les résultats aux variables de stockage une fois tous les calculs terminés.

Gas optimization des dix meilleures pratiques pour les smart contracts Ethereum

( 2. Emballage des variables

Le nombre de slots de stockage ) utilisés dans les smart contracts et la manière dont les développeurs représentent les données auront un impact significatif sur la consommation de Gas.

Le compilateur Solidity regroupe les variables de stockage continues pendant le processus de compilation et utilise des emplacements de stockage de 32 octets comme unité de base pour le stockage des variables. Le regroupement des variables signifie qu'en organisant raisonnablement les variables, plusieurs variables peuvent être adaptées à un seul emplacement de stockage.

Grâce à cet ajustement de détail, les développeurs peuvent économiser 20 000 unités de Gas. Stocker un emplacement de stockage inutilisé nécessite 20 000 Gas, mais maintenant, il ne faut que deux emplacements de stockage.

Puisque chaque emplacement de stockage consomme du Gas, le regroupement de variables optimise l'utilisation du Gas en réduisant le nombre d'emplacements de stockage requis.

![Optimisation des Gas pour les smart contracts Ethereum : les 10 meilleures pratiques]###https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(

) 3. Optimiser les types de données

Une variable peut être représentée par différents types de données, mais le coût des opérations correspondantes varie selon le type de données. Choisir le bon type de données aide à optimiser l'utilisation du Gas.

Par exemple, dans Solidity, les entiers peuvent être subdivisés en différentes tailles : uint8, uint16, uint32, etc. Étant donné que l'EVM exécute des opérations par unités de 256 bits, utiliser uint8 signifie que l'EVM doit d'abord le convertir en uint256, et cette conversion consomme du Gas supplémentaire.

À première vue, utiliser uint256 est moins cher que uint8. Cependant, cela change si l'optimisation par empaquetage de variables est appliquée. Si le développeur peut empaqueter quatre variables uint8 dans un seul emplacement de stockage, alors le coût total d'itération sur elles sera inférieur à celui de quatre variables uint256. De cette manière, les smart contracts peuvent lire et écrire un emplacement de stockage en une seule opération et placer quatre variables uint8 dans la mémoire/le stockage.

Ethereum smart contracts des meilleures pratiques d'optimisation du Gas

( 4. Utiliser des variables de taille fixe au lieu de variables dynamiques

Si les données peuvent être contrôlées dans 32 octets, il est conseillé d'utiliser le type de données bytes32 au lieu de bytes ou strings. En général, les variables de taille fixe consomment moins de Gas que les variables de taille variable. Si la longueur des octets peut être limitée, il est préférable de choisir la longueur minimale allant de bytes1 à bytes32.

) 5. Mappage et tableaux

Les listes de données de Solidity peuvent être représentées par deux types de données : les tableaux ### Arrays ( et les mappages ) Mappings ###, mais leur syntaxe et leur structure sont complètement différentes.

Dans la plupart des cas, les mappages sont plus efficaces et moins coûteux, mais les tableaux ont une itérabilité et prennent en charge le regroupement des types de données. Par conséquent, il est recommandé d'utiliser des mappages en priorité lors de la gestion de listes de données, sauf si une itération est nécessaire ou si le regroupement des types de données peut optimiser la consommation de Gas.

![Optimisation des Gas pour les smart contracts Ethereum : les 10 meilleures pratiques]###https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(

) 6. Utiliser calldata au lieu de memory

Les variables déclarées dans les paramètres de la fonction peuvent être stockées dans calldata ou memory. La principale différence entre les deux est que memory peut être modifié par la fonction, tandis que calldata est immuable.

Rappelez-vous ce principe : si les paramètres de la fonction sont en lecture seule, il est préférable d'utiliser calldata plutôt que memory. Cela permet d'éviter les opérations de copie inutiles de calldata de la fonction vers memory.

( 7. Utilisez les mots-clés Constant/Immutable autant que possible

Les variables Constant/Immutable ne seront pas stockées dans le stockage du contrat. Ces variables sont calculées au moment de la compilation et sont stockées dans le bytecode du contrat. Par conséquent, leur coût d'accès est bien inférieur à celui du stockage, il est donc recommandé d'utiliser les mots-clés Constant ou Immutable autant que possible.

![Optimisation du Gas des smart contracts Ethereum : les dix meilleures pratiques])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(

) 8. Utiliser Unchecked en veillant à ce qu'il n'y ait pas de débordement/sous-débordement.

Lorsque les développeurs peuvent s'assurer que les opérations arithmétiques ne provoqueront pas de dépassement ou de sous-dépassement, ils peuvent utiliser le mot-clé unchecked introduit dans Solidity v0.8.0 pour éviter des vérifications inutiles de dépassement ou de sous-dépassement, économisant ainsi des frais de Gas.

De plus, les compilateurs version 0.8.0 et supérieures n'ont plus besoin d'utiliser la bibliothèque SafeMath, car le compilateur lui-même a intégré des fonctionnalités de protection contre les débordements et les sous-dépassements.

9. Optimiseur de modification

Le code du modificateur est intégré dans la fonction modifiée, et chaque fois que le modificateur est utilisé, son code est copié. Cela augmente la taille du bytecode et augmente la consommation de Gas. Une méthode d'optimisation consiste à restructurer la logique en une fonction interne, permettant de réutiliser cette fonction interne dans le modificateur, ce qui peut réduire la taille du bytecode et diminuer le coût en Gas.

![Optimisation des Gas pour les smart contracts Ethereum : Top 10 des meilleures pratiques]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(

) 10. optimisation de court-circuit

Pour les opérateurs || et &&, l'évaluation logique subit une évaluation de court-circuit, c'est-à-dire que si la première condition peut déjà déterminer le résultat de l'expression logique, la deuxième condition ne sera pas évaluée.

Pour optimiser la consommation de Gas, il convient de placer les conditions à faible coût de calcul en premier, ce qui peut permettre de sauter des calculs coûteux.

![Gas optimisation des dix meilleures pratiques pour les smart contracts Ethereum]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp###

Suggestions générales supplémentaires

( 1. Supprimer le code inutile

Si le contrat contient des fonctions ou des variables non utilisées, il est conseillé de les supprimer. C'est la méthode la plus directe pour réduire les coûts de déploiement du contrat et maintenir la taille du contrat petite.

Voici quelques conseils pratiques :

  • Utilisez les algorithmes les plus efficaces pour les calculs. Si les résultats de certains calculs sont directement utilisés dans le contrat, alors ces processus de calcul redondants doivent être supprimés. En essence, tout calcul non utilisé doit être supprimé.

  • Dans Ethereum, les développeurs peuvent obtenir des récompenses en Gas en libérant de l'espace de stockage. Si une variable n'est plus nécessaire, elle doit être supprimée en utilisant le mot-clé delete ou en la définissant sur sa valeur par défaut.

  • Optimisation des boucles : éviter les opérations de boucle coûteuses, fusionner les boucles autant que possible et déplacer les calculs répétitifs en dehors du corps de la boucle.

) 2. Utiliser des contrats précompilés

Les contrats précompilés offrent des fonctions de bibliothèque complexes, telles que des opérations de cryptage et de hachage. Comme le code ne s'exécute pas sur l'EVM mais localement sur les nœuds clients, moins de Gas est nécessaire. L'utilisation de contrats précompilés peut économiser du Gas en réduisant la charge de calcul requise pour exécuter des contrats intelligents.

Les exemples de contrats précompilés incluent l'algorithme de signature numérique à courbe elliptique ###ECDSA( et l'algorithme de hachage SHA2-256. En utilisant ces contrats précompilés dans les smart contracts, les développeurs peuvent réduire les coûts en Gaz et améliorer l'efficacité de l'exécution des applications.

![Optimisation des Gas pour les smart contracts Ethereum : dix meilleures pratiques])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp###

3. Utiliser le code d'assemblage en ligne

L'assemblage en ligne ( in-line assembly ) permet aux développeurs d'écrire du code bas niveau mais efficace qui peut être exécuté directement par l'EVM, sans avoir à utiliser des opérations coûteuses en Solidity. L'assemblage en ligne permet également un contrôle plus précis de l'utilisation de la mémoire et du stockage, ce qui réduit encore les frais de Gas. De plus, l'assemblage en ligne peut effectuer des opérations complexes qui sont difficiles à réaliser uniquement avec Solidity, offrant ainsi plus de flexibilité pour optimiser la consommation de Gas.

Cependant, l'utilisation d'assemblage en ligne peut également comporter des risques et être sujette à des erreurs. Par conséquent, il doit être utilisé avec prudence, réservé aux développeurs expérimentés.

( 4. Utiliser des solutions de Layer 2

L'utilisation de solutions Layer 2 peut réduire la quantité de données nécessitant un stockage et un calcul sur le réseau principal Ethereum.

comme les rollups et les chaînes latérales

ETH3.32%
Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
  • Récompense
  • 4
  • Partager
Commentaire
0/400
BlockchainBouncervip
· 08-05 14:56
Il est très nécessaire de réduire les frais de gas.
Voir l'originalRépondre0
WalletAnxietyPatientvip
· 08-05 14:56
Les développeurs de省gas sont vraiment incroyables.
Voir l'originalRépondre0
AirdropLickervip
· 08-05 14:50
Économisez du gas et gagnez beaucoup d'argent
Voir l'originalRépondre0
ContractExplorervip
· 08-05 14:49
l'optimisation du gas est très importante
Voir l'originalRépondre0
  • Épingler
Trader les cryptos partout et à tout moment
qrCode
Scan pour télécharger Gate app
Communauté
Français (Afrique)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)