Les frais de gaz sur le Mainnet Ethereum ont toujours été un gros problème, surtout en cas de congestion du réseau. Pendant les périodes de pointe, les utilisateurs doivent souvent payer des montants élevés de Blanchiment de capitaux. Par conséquent, l'optimisation des frais de gaz lors du développement de smart contracts est particulièrement importante. Une optimisation de la consommation de gaz peut non seulement réduire efficacement les coûts de transaction, mais aussi améliorer l'efficacité des transactions, offrant aux utilisateurs une expérience d'utilisation de la blockchain plus économique et efficace.
Cet article va donner un aperçu du mécanisme des frais de gas de l'Ethereum Virtual Machine (EVM), des 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. Nous espérons que ces informations inspireront et aideront les développeurs, tout en aidant également les utilisateurs ordinaires à mieux comprendre le fonctionnement des frais de gas de l'EVM, afin de relever ensemble les défis de l'écosystème de la blockchain.
Introduction au mécanisme de frais de gas de l'EVM
Dans les réseaux compatibles avec EVM, "Gas" désigne l'unité de mesure de la capacité de calcul nécessaire pour exécuter une opération spécifique.
Le schéma ci-dessous illustre la structure de l'EVM. Dans le schéma, la consommation de gaz est divisée 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.
Source: Site officiel d'Ethereum [1]
Étant donné que l'exécution de chaque transaction nécessite des ressources de calcul, des frais sont prélevés pour éviter les boucles infinies et les attaques par déni de service (DoS). Les frais nécessaires pour effectuer une transaction sont appelés frais de « Gas ».
Depuis l'entrée en vigueur de l'EIP-1559 (London Hard Fork), 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 détruits et les frais prioritaires seront utilisés comme incitation pour encourager les validateurs à ajouter des transactions à la blockchain. En fixant des frais prioritaires plus élevés lors de l'envoi de transactions, il est possible d'augmenter les chances que la transaction soit incluse dans le prochain bloc. Cela est similaire à une sorte de ``pourboire'' que les utilisateurs paient aux validateurs.
1. Comprendre l'optimisation du gas dans l'EVM
Lorsque vous compilez un contrat intelligent en Solidity, le contrat est converti en une série de « codes d'opération », ou opcodes.
Chaque opcode (tel que la création de contrat, l'appel de message, l'accès au stockage du compte et l'exécution d'opérations sur la machine virtuelle) a un coût de consommation de gaz reconnu, ces coûts sont enregistrés dans le livre jaune de l'ETH Mainnet [2].
Après plusieurs modifications de l'EIP, les coûts en gas de certains opcodes ont été ajustés et peuvent différer légèrement du livre jaune. Pour plus d'informations sur les coûts les plus récents des opcodes, veuillez vous référer à ce lien [3].
2. Concept de base de l'optimisation du gas
L'optimisation du gas est un concept central qui consiste à privilégier les opérations à coût efficace sur la chaîne de blocs EVM afin d'éviter les opérations coûteuses en gas.
Dans l'EVM, les opérations suivantes ont des coûts plus bas :
Lecture et écriture de variables en mémoire
Lire les constantes et les variables immuables
Lire et écrire des variables locales
Lire les variables calldata, telles que les tableaux calldata et les structures
Appel de fonction interne
Les opérations à coût élevé comprennent :
Lire et écrire des variables d'état stockées dans le stockage du contrat
Appel de fonction externe
Opération cyclique
Optimisation des frais de gaz EVM - Meilleures pratiques
Sur la base des concepts fondamentaux ci-dessus, nous avons compilé une liste de bonnes pratiques d'optimisation des frais de gaz pour la communauté des développeurs. En suivant ces pratiques, les développeurs peuvent réduire la consommation de gaz des contrats intelligents, réduire les coûts de transaction et créer des applications plus efficaces et conviviales pour les utilisateurs.
1. Essayez de réduire au maximum l'utilisation du stockage
En Solidité, le stockage est une ressource limitée, dont la consommation de gaz est beaucoup plus élevée que la mémoire. Chaque fois qu'un contrat intelligent lit ou écrit des données à partir du stockage, cela entraîne des coûts de gaz élevés.
Selon la définition du Livre jaune d'ETH, le coût des opérations de stockage est plus de 100 fois supérieur à celui des opérations de mémoire. Par exemple, les instructions OPcodesmload et mstore ne consomment que 3 unités de gaz, tandis que les opérations de stockage telles que sload et sstore nécessitent au moins 100 unités de coût, même dans des conditions idéales.
Les 10 meilleures pratiques d'optimisation du gaz pour les contrats intelligents sur ETH.
Les méthodes de restriction de l'utilisation du stockage comprennent :
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, puis en attribuant les résultats aux variables de stockage une fois tous les calculs terminés.
2. Emballage des variables
Le nombre de slots de stockage utilisés dans les contrats intelligents ainsi que la manière dont les développeurs représentent les données auront un impact considérable sur la consommation de gaz.
Le compilateur Solidity regroupera les variables de stockage continues lors du processus de compilation et les stockera dans des emplacements de stockage de 32 octets comme unité de base pour le stockage des variables. L'emballage des variables fait référence à l'arrangement approprié des variables de manière à ce que plusieurs variables puissent s'adapter à un seul emplacement de stockage.
Sur la gauche se trouve une implémentation moins efficace qui consommera 3 emplacements de stockage ; Sur la droite, il y a une mise en œuvre plus efficace.
Les 10 meilleures pratiques d'optimisation du gaz pour les contrats intelligents ETH坊 [ETH]
Grâce à ce petit ajustement, les développeurs peuvent économiser 20,000 unités de gas (stocker une fente de stockage non utilisée nécessite 20,000 Gas), mais maintenant ils n'ont besoin que de deux fentes de stockage.
Étant donné que chaque emplacement de stockage consomme du gas, l'emballage des variables optimise l'utilisation du gas en réduisant le nombre d'emplacements de stockage nécessaires.
3. Optimisation des types de données
Une variable peut être représentée par plusieurs types de données, mais les coûts d'opération varient également en fonction des types de données. Choisir le bon type de données contribue à optimiser l'utilisation du gas.
Par exemple, en Solidity, les entiers peuvent être subdivisés en différentes tailles : uint8, uint16, uint32, etc. Comme l'EVM exécute des opérations par unité de 256 bits, l'utilisation de uint8 signifie que l'EVM doit d'abord le convertir en uint256, ce qui entraîne une consommation supplémentaire de gas.
Nous pouvons comparer le coût en gaz de uint8 et uint256 en utilisant le code dans l'image. La fonction UseUint() consomme 120 382 unités de gaz, tandis que la fonction UseUInt8() consomme 166 111 unités de gaz.
Pris individuellement, l'utilisation de uint256 est moins chère que celle de uint8. Cependant, si vous utilisez l'optimisation de regroupement de variables que nous avons suggérée précédemment, cela change. Si le développeur peut regrouper quatre variables uint8 dans un seul emplacement de stockage, le coût total de leur itération sera inférieur à celui de quatre variables uint256. Ainsi, le contrat intelligent peut lire et écrire un emplacement de stockage une fois et placer quatre variables uint8 en mémoire / stockage dans une seule opération.
4. Utilisez des variables de taille fixe pour remplacer les variables dynamiques
Si les données peuvent être contenues dans 32 octets, il est recommandé d'utiliser le type de données bytes32 à la place des types 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 en octets peut être limitée, il est préférable de choisir la longueur minimale allant de bytes1 à bytes32.
! [Top 10 des meilleures pratiques pour l’optimisation du gaz des contrats intelligents dans ETH Square] (https://cdn-img.panewslab.com/yijian/2024/12/30/images/f5d5201df99b4efc4f05505890f72811.jpg)
5. Mapping et tableaux
Les listes de données en Solidity peuvent être représentées par deux types de données : les tableaux (arrays) et les mappings (correspondances), mais leur syntaxe et leur structure sont totalement différentes.
La cartographie est généralement plus efficace et moins coûteuse dans la plupart des cas, mais les tableaux sont itérables et prennent en charge l'emballage des types de données. Par conséquent, il est recommandé d'utiliser la cartographie en priorité lors de la gestion des listes de données, sauf si vous avez besoin d'itérer ou d'optimiser la consommation de gas avec l'emballage des types de données.
6. Utilisez calldata à la place 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.
Souvenez-vous de 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 évite les opérations de copie inutiles de calldata à la mémoire.
Exemple 1: Utilisation de la mémoire
Lors de l'utilisation du mot-clé memory, les valeurs du tableau sont copiées de la calldata encodée vers la mémoire lors du processus de décodage ABI. Le coût d'exécution de ce bloc de code est de 3 694 unités de gas.
Exemple 2: Utilisation de calldata
Lors de la lecture directe des valeurs à partir des calldata, ignorez les opérations intermédiaires en mémoire. Cette optimisation réduit les coûts d'exécution à seulement 2,413 unités de gas, améliorant ainsi l'efficacité de 35%.
7. Utilisez autant que possible les mots-clés Constant/Immutable
Les variables Constant/Immutable ne sont pas stockées dans le stockage du contrat. Ces variables sont calculées lors de la compilation et stockées dans le bytecode du contrat. Par conséquent, leur coût d'accès est beaucoup plus faible par rapport au stockage, il est recommandé d'utiliser autant que possible les mots clés Constant ou Immutable.
8. Utilisez Unchecked lorsque vous êtes sûr qu'il n'y aura pas de débordement / sous-débordement
Lorsque les développeurs peuvent être certains que les opérations arithmétiques ne provoqueront pas de dépassement ou de sous-dépassement, ils peuvent utiliser le mot-clé non vérifié introduit par Solidity v0.8.0 pour éviter les vérifications inutiles de dépassement ou de sous-dépassement, ce qui permet d'économiser les coûts de gaz.
Dans le diagramme ci-dessous, contrainte conditionnelle i
De plus, les compilateurs de version 0.8.0 et supérieure n'ont plus besoin d'utiliser la bibliothèque SafeMath car ils intègrent désormais eux-mêmes des fonctionnalités de protection contre les débordements et les sous-débordements.
9. Optimiseur de modification
Le code du modificateur est incorporé dans la fonction modifiée à chaque utilisation du modificateur, son code est copié. Cela augmente la taille de l'octet et augmente la consommation de gaz. Voici une méthode pour optimiser le coût du gaz du modificateur ### :
Avant optimisation :
Optimisé:
Dans ce cas, en restructurant la logique en une fonction interne _checkOwner(), il est possible de réutiliser cette fonction interne dans les modificateurs, ce qui permet de réduire la taille du bytecode et les coûts de gaz.
10. Optimisation de court-circuit
Pour les opérateurs || et &&, l'évaluation logique se produit en 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.
Afin d’optimiser la consommation de gaz, il convient de donner la priorité aux conditions peu coûteuses en termes de calcul afin qu’il soit possible d’éviter les calculs coûteux.
Conseils généraux supplémentaires
1. Supprimer le code inutile
Si des fonctions ou des variables inutilisées existent dans le contrat, il est recommandé de les supprimer. C'est le moyen le plus direct de réduire les coûts de déploiement du contrat et de maintenir sa taille petite.
Voici quelques conseils pratiques :
Effectuez des calculs avec les algorithmes les plus efficaces. Si les résultats de certains calculs sont directement utilisés dans le contrat, les processus de calcul redondants doivent être éliminés. Fondamentalement, tout calcul inutilisé doit être supprimé.
Dans l'ETH, les développeurs sont récompensés par des frais de transaction pour libérer de l'espace de stockage. Lorsqu'une variable n'est plus nécessaire, elle doit être supprimée à l'aide du mot-clé delete ou réinitialisée à sa valeur par défaut.
Optimisation de boucle : Évitez les opérations en boucle coûteuses, fusionnez autant que possible les boucles et sortez les calculs répétés du corps de la boucle.
[4]# 2. Utilisation des contrats précompilés
Les contrats précompilés fournissent des fonctions de bibliothèque complexes, telles que les opérations de cryptage et de hachage. Étant donné que le code n'est pas exécuté sur l'EVM mais localement sur le nœud client, moins de gas est nécessaire. L'utilisation de contrats précompilés peut permettre d'économiser du gas en réduisant la charge de calcul requise pour l'exécution du smart contract.
Les exemples de contrats pré-compilés incluent l'algorithme de signature numérique à courbes elliptiques (ECDSA) et l'algorithme de hachage SHA2-256. En utilisant ces contrats pré-compilés dans les contrats intelligents, les développeurs peuvent réduire les coûts de transaction et améliorer l'efficacité de l'application.
Pour la liste complète des contrats précompilés pris en charge par le réseau Ethereum, veuillez consulter ici ###.
3. Utilisation du code d'assemblage en ligne
L'assemblage en ligne permet aux développeurs d'écrire un code bas niveau mais efficace, pouvant être exécuté directement par l'EVM, sans avoir recours aux coûteuses opcodes 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 davantage les frais de gaz. De plus, l'assemblage en ligne permet d'effectuer des opérations complexes difficiles à réaliser uniquement avec Solidity, offrant ainsi plus de flexibilité pour optimiser la consommation de gaz.
Voici un exemple de code utilisant l'assemblage en ligne pour économiser du gas :
Les 10 meilleures pratiques d'optimisation Gas pour les contrats intelligents ETH 坊!
Comparée au cas d'utilisation standard, la deuxième utilisation de la technologie d'assemblage en ligne présente une efficacité en gaz plus élevée, comme le montre la figure ci-dessus.
Cependant, l'utilisation de l'assembleur en ligne peut également comporter des risques et être sujette à des erreurs. Par conséquent, son utilisation doit être prudente et réservée aux développeurs expérimentés.
4. Utilisation de la solution Layer 2
L'utilisation de solutions de couche 2 permet de réduire la quantité de données à stocker et à calculer sur le Mainnet d'ETH.
Des solutions de couche 2 telles que rollups, les sidechains et les canaux d'état peuvent décharger le traitement des transactions du mainnet ETH, permettant ainsi des transactions plus rapides et moins coûteuses.
En regroupant un grand nombre de transactions, ces solutions réduisent le nombre de transactions sur la chaîne, ce qui permet de réduire les coûts de gaz. Les solutions de couche 2 peuvent également améliorer la scalabilité d'Ethereum, permettant ainsi à davantage d'utilisateurs et d'applications de participer au réseau sans provoquer de congestion.
5. Utilisation d'outils et de bibliothèques d'optimisation
Il existe plusieurs outils d'optimisation disponibles, tels que l'optimiseur solc, l'optimiseur de construction de Truffle et le compilateur Solidity de Remix.
Ces outils peuvent aider à minimiser la taille du bytecode, supprimer le code inutile et réduire le nombre d'opérations nécessaires à l'exécution du contrat intelligent. En combinant d'autres bibliothèques d'optimisation du gas, telles que 'solmate', les développeurs peuvent réduire efficacement les coûts de transaction et améliorer l'efficacité des contrats intelligents.
[1] Conclusion
L'optimisation de la consommation de gas est une étape importante pour les développeurs, car elle permet de minimiser le Coût de transaction tout en améliorant l'efficacité des Smart Contracts sur les réseaux compatibles avec l'EVM. En priorisant l'exécution des opérations à moindre coût, en réduisant l'utilisation du stockage, en utilisant l'assemblage en ligne et en suivant d'autres meilleures pratiques discutées dans cet article, les développeurs peuvent efficacement réduire la consommation de gas des contrats.
Cependant, il est important de noter que, lors de l'optimisation, les développeurs doivent opérer avec prudence afin d'éviter d'introduire des failles de sécurité. Lors du processus d'optimisation du code et de réduction de la consommation de gas, la sécurité inhérente des contrats intelligents ne doit jamais être sacrifiée.
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.
Les 10 meilleures pratiques d'optimisation du Gas pour les contrats intelligents sur Ethereum
Les frais de gaz sur le Mainnet Ethereum ont toujours été un gros problème, surtout en cas de congestion du réseau. Pendant les périodes de pointe, les utilisateurs doivent souvent payer des montants élevés de Blanchiment de capitaux. Par conséquent, l'optimisation des frais de gaz lors du développement de smart contracts est particulièrement importante. Une optimisation de la consommation de gaz peut non seulement réduire efficacement les coûts de transaction, mais aussi améliorer l'efficacité des transactions, offrant aux utilisateurs une expérience d'utilisation de la blockchain plus économique et efficace.
Cet article va donner un aperçu du mécanisme des frais de gas de l'Ethereum Virtual Machine (EVM), des 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. Nous espérons que ces informations inspireront et aideront les développeurs, tout en aidant également les utilisateurs ordinaires à mieux comprendre le fonctionnement des frais de gas de l'EVM, afin de relever ensemble les défis de l'écosystème de la blockchain.
Introduction au mécanisme de frais de gas de l'EVM
Dans les réseaux compatibles avec EVM, "Gas" désigne l'unité de mesure de la capacité de calcul nécessaire pour exécuter une opération spécifique.
Le schéma ci-dessous illustre la structure de l'EVM. Dans le schéma, la consommation de gaz est divisée 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 sont prélevés pour éviter les boucles infinies et les attaques par déni de service (DoS). Les frais nécessaires pour effectuer une transaction sont appelés frais de « Gas ».
Depuis l'entrée en vigueur de l'EIP-1559 (London Hard Fork), 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 détruits et les frais prioritaires seront utilisés comme incitation pour encourager les validateurs à ajouter des transactions à la blockchain. En fixant des frais prioritaires plus élevés lors de l'envoi de transactions, il est possible d'augmenter les chances que la transaction soit incluse dans le prochain bloc. Cela est similaire à une sorte de ``pourboire'' que les utilisateurs paient aux validateurs.
1. Comprendre l'optimisation du gas dans l'EVM
Lorsque vous compilez un contrat intelligent en Solidity, le contrat est converti en une série de « codes d'opération », ou opcodes.
Chaque opcode (tel que la création de contrat, l'appel de message, l'accès au stockage du compte et l'exécution d'opérations sur la machine virtuelle) a un coût de consommation de gaz reconnu, ces coûts sont enregistrés dans le livre jaune de l'ETH Mainnet [2].
Après plusieurs modifications de l'EIP, les coûts en gas de certains opcodes ont été ajustés et peuvent différer légèrement du livre jaune. Pour plus d'informations sur les coûts les plus récents des opcodes, veuillez vous référer à ce lien [3].
2. Concept de base de l'optimisation du gas
L'optimisation du gas est un concept central qui consiste à privilégier les opérations à coût efficace sur la chaîne de blocs EVM afin d'éviter les opérations coûteuses en gas.
Dans l'EVM, les opérations suivantes ont des coûts plus bas :
Les opérations à coût élevé comprennent :
Optimisation des frais de gaz EVM - Meilleures pratiques
Sur la base des concepts fondamentaux ci-dessus, nous avons compilé une liste de bonnes pratiques d'optimisation des frais de gaz pour la communauté des développeurs. En suivant ces pratiques, les développeurs peuvent réduire la consommation de gaz des contrats intelligents, réduire les coûts de transaction et créer des applications plus efficaces et conviviales pour les utilisateurs.
1. Essayez de réduire au maximum l'utilisation du stockage
En Solidité, le stockage est une ressource limitée, dont la consommation de gaz est beaucoup plus élevée que la mémoire. Chaque fois qu'un contrat intelligent lit ou écrit des données à partir du stockage, cela entraîne des coûts de gaz élevés.
Selon la définition du Livre jaune d'ETH, le coût des opérations de stockage est plus de 100 fois supérieur à celui des opérations de mémoire. Par exemple, les instructions OPcodesmload et mstore ne consomment que 3 unités de gaz, tandis que les opérations de stockage telles que sload et sstore nécessitent au moins 100 unités de coût, même dans des conditions idéales.
Les 10 meilleures pratiques d'optimisation du gaz pour les contrats intelligents sur ETH.
Les méthodes de restriction de l'utilisation du stockage comprennent :
2. Emballage des variables
Le nombre de slots de stockage utilisés dans les contrats intelligents ainsi que la manière dont les développeurs représentent les données auront un impact considérable sur la consommation de gaz.
Le compilateur Solidity regroupera les variables de stockage continues lors du processus de compilation et les stockera dans des emplacements de stockage de 32 octets comme unité de base pour le stockage des variables. L'emballage des variables fait référence à l'arrangement approprié des variables de manière à ce que plusieurs variables puissent s'adapter à un seul emplacement de stockage.
Sur la gauche se trouve une implémentation moins efficace qui consommera 3 emplacements de stockage ; Sur la droite, il y a une mise en œuvre plus efficace.
Les 10 meilleures pratiques d'optimisation du gaz pour les contrats intelligents ETH坊 [ETH]
Grâce à ce petit ajustement, les développeurs peuvent économiser 20,000 unités de gas (stocker une fente de stockage non utilisée nécessite 20,000 Gas), mais maintenant ils n'ont besoin que de deux fentes de stockage.
Étant donné que chaque emplacement de stockage consomme du gas, l'emballage des variables optimise l'utilisation du gas en réduisant le nombre d'emplacements de stockage nécessaires.
3. Optimisation des types de données
Une variable peut être représentée par plusieurs types de données, mais les coûts d'opération varient également en fonction des types de données. Choisir le bon type de données contribue à optimiser l'utilisation du gas.
Par exemple, en Solidity, les entiers peuvent être subdivisés en différentes tailles : uint8, uint16, uint32, etc. Comme l'EVM exécute des opérations par unité de 256 bits, l'utilisation de uint8 signifie que l'EVM doit d'abord le convertir en uint256, ce qui entraîne une consommation supplémentaire de gas.
Nous pouvons comparer le coût en gaz de uint8 et uint256 en utilisant le code dans l'image. La fonction UseUint() consomme 120 382 unités de gaz, tandis que la fonction UseUInt8() consomme 166 111 unités de gaz.
Pris individuellement, l'utilisation de uint256 est moins chère que celle de uint8. Cependant, si vous utilisez l'optimisation de regroupement de variables que nous avons suggérée précédemment, cela change. Si le développeur peut regrouper quatre variables uint8 dans un seul emplacement de stockage, le coût total de leur itération sera inférieur à celui de quatre variables uint256. Ainsi, le contrat intelligent peut lire et écrire un emplacement de stockage une fois et placer quatre variables uint8 en mémoire / stockage dans une seule opération.
4. Utilisez des variables de taille fixe pour remplacer les variables dynamiques
Si les données peuvent être contenues dans 32 octets, il est recommandé d'utiliser le type de données bytes32 à la place des types 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 en octets peut être limitée, il est préférable de choisir la longueur minimale allant de bytes1 à bytes32.
! [Top 10 des meilleures pratiques pour l’optimisation du gaz des contrats intelligents dans ETH Square] (https://cdn-img.panewslab.com/yijian/2024/12/30/images/f5d5201df99b4efc4f05505890f72811.jpg)
5. Mapping et tableaux
Les listes de données en Solidity peuvent être représentées par deux types de données : les tableaux (arrays) et les mappings (correspondances), mais leur syntaxe et leur structure sont totalement différentes.
La cartographie est généralement plus efficace et moins coûteuse dans la plupart des cas, mais les tableaux sont itérables et prennent en charge l'emballage des types de données. Par conséquent, il est recommandé d'utiliser la cartographie en priorité lors de la gestion des listes de données, sauf si vous avez besoin d'itérer ou d'optimiser la consommation de gas avec l'emballage des types de données.
6. Utilisez calldata à la place 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.
Souvenez-vous de 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 évite les opérations de copie inutiles de calldata à la mémoire.
Exemple 1: Utilisation de la mémoire
![Les 10 meilleures pratiques d'optimisation du gas pour les contrats intelligents sur Ethereum]()
Lors de l'utilisation du mot-clé memory, les valeurs du tableau sont copiées de la calldata encodée vers la mémoire lors du processus de décodage ABI. Le coût d'exécution de ce bloc de code est de 3 694 unités de gas.
Exemple 2: Utilisation de calldata
Lors de la lecture directe des valeurs à partir des calldata, ignorez les opérations intermédiaires en mémoire. Cette optimisation réduit les coûts d'exécution à seulement 2,413 unités de gas, améliorant ainsi l'efficacité de 35%.
7. Utilisez autant que possible les mots-clés Constant/Immutable
Les variables Constant/Immutable ne sont pas stockées dans le stockage du contrat. Ces variables sont calculées lors de la compilation et stockées dans le bytecode du contrat. Par conséquent, leur coût d'accès est beaucoup plus faible par rapport au stockage, il est recommandé d'utiliser autant que possible les mots clés Constant ou Immutable.
8. Utilisez Unchecked lorsque vous êtes sûr qu'il n'y aura pas de débordement / sous-débordement
Lorsque les développeurs peuvent être certains que les opérations arithmétiques ne provoqueront pas de dépassement ou de sous-dépassement, ils peuvent utiliser le mot-clé non vérifié introduit par Solidity v0.8.0 pour éviter les vérifications inutiles de dépassement ou de sous-dépassement, ce qui permet d'économiser les coûts de gaz.
Dans le diagramme ci-dessous, contrainte conditionnelle i
De plus, les compilateurs de version 0.8.0 et supérieure n'ont plus besoin d'utiliser la bibliothèque SafeMath car ils intègrent désormais eux-mêmes des fonctionnalités de protection contre les débordements et les sous-débordements.
9. Optimiseur de modification
Le code du modificateur est incorporé dans la fonction modifiée à chaque utilisation du modificateur, son code est copié. Cela augmente la taille de l'octet et augmente la consommation de gaz. Voici une méthode pour optimiser le coût du gaz du modificateur ### :
Avant optimisation :
Optimisé:
Dans ce cas, en restructurant la logique en une fonction interne _checkOwner(), il est possible de réutiliser cette fonction interne dans les modificateurs, ce qui permet de réduire la taille du bytecode et les coûts de gaz.
10. Optimisation de court-circuit
Pour les opérateurs || et &&, l'évaluation logique se produit en 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.
Afin d’optimiser la consommation de gaz, il convient de donner la priorité aux conditions peu coûteuses en termes de calcul afin qu’il soit possible d’éviter les calculs coûteux.
Conseils généraux supplémentaires
1. Supprimer le code inutile
Si des fonctions ou des variables inutilisées existent dans le contrat, il est recommandé de les supprimer. C'est le moyen le plus direct de réduire les coûts de déploiement du contrat et de maintenir sa taille petite.
Voici quelques conseils pratiques :
Effectuez des calculs avec les algorithmes les plus efficaces. Si les résultats de certains calculs sont directement utilisés dans le contrat, les processus de calcul redondants doivent être éliminés. Fondamentalement, tout calcul inutilisé doit être supprimé.
Dans l'ETH, les développeurs sont récompensés par des frais de transaction pour libérer de l'espace de stockage. Lorsqu'une variable n'est plus nécessaire, elle doit être supprimée à l'aide du mot-clé delete ou réinitialisée à sa valeur par défaut.
Optimisation de boucle : Évitez les opérations en boucle coûteuses, fusionnez autant que possible les boucles et sortez les calculs répétés du corps de la boucle.
[4]# 2. Utilisation des contrats précompilés
Les contrats précompilés fournissent des fonctions de bibliothèque complexes, telles que les opérations de cryptage et de hachage. Étant donné que le code n'est pas exécuté sur l'EVM mais localement sur le nœud client, moins de gas est nécessaire. L'utilisation de contrats précompilés peut permettre d'économiser du gas en réduisant la charge de calcul requise pour l'exécution du smart contract.
Les exemples de contrats pré-compilés incluent l'algorithme de signature numérique à courbes elliptiques (ECDSA) et l'algorithme de hachage SHA2-256. En utilisant ces contrats pré-compilés dans les contrats intelligents, les développeurs peuvent réduire les coûts de transaction et améliorer l'efficacité de l'application.
Pour la liste complète des contrats précompilés pris en charge par le réseau Ethereum, veuillez consulter ici ###.
3. Utilisation du code d'assemblage en ligne
L'assemblage en ligne permet aux développeurs d'écrire un code bas niveau mais efficace, pouvant être exécuté directement par l'EVM, sans avoir recours aux coûteuses opcodes 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 davantage les frais de gaz. De plus, l'assemblage en ligne permet d'effectuer des opérations complexes difficiles à réaliser uniquement avec Solidity, offrant ainsi plus de flexibilité pour optimiser la consommation de gaz.
Voici un exemple de code utilisant l'assemblage en ligne pour économiser du gas :
Les 10 meilleures pratiques d'optimisation Gas pour les contrats intelligents ETH 坊!
Comparée au cas d'utilisation standard, la deuxième utilisation de la technologie d'assemblage en ligne présente une efficacité en gaz plus élevée, comme le montre la figure ci-dessus.
Cependant, l'utilisation de l'assembleur en ligne peut également comporter des risques et être sujette à des erreurs. Par conséquent, son utilisation doit être prudente et réservée aux développeurs expérimentés.
4. Utilisation de la solution Layer 2
L'utilisation de solutions de couche 2 permet de réduire la quantité de données à stocker et à calculer sur le Mainnet d'ETH.
Des solutions de couche 2 telles que rollups, les sidechains et les canaux d'état peuvent décharger le traitement des transactions du mainnet ETH, permettant ainsi des transactions plus rapides et moins coûteuses.
En regroupant un grand nombre de transactions, ces solutions réduisent le nombre de transactions sur la chaîne, ce qui permet de réduire les coûts de gaz. Les solutions de couche 2 peuvent également améliorer la scalabilité d'Ethereum, permettant ainsi à davantage d'utilisateurs et d'applications de participer au réseau sans provoquer de congestion.
5. Utilisation d'outils et de bibliothèques d'optimisation
Il existe plusieurs outils d'optimisation disponibles, tels que l'optimiseur solc, l'optimiseur de construction de Truffle et le compilateur Solidity de Remix.
Ces outils peuvent aider à minimiser la taille du bytecode, supprimer le code inutile et réduire le nombre d'opérations nécessaires à l'exécution du contrat intelligent. En combinant d'autres bibliothèques d'optimisation du gas, telles que 'solmate', les développeurs peuvent réduire efficacement les coûts de transaction et améliorer l'efficacité des contrats intelligents.
[1] Conclusion
L'optimisation de la consommation de gas est une étape importante pour les développeurs, car elle permet de minimiser le Coût de transaction tout en améliorant l'efficacité des Smart Contracts sur les réseaux compatibles avec l'EVM. En priorisant l'exécution des opérations à moindre coût, en réduisant l'utilisation du stockage, en utilisant l'assemblage en ligne et en suivant d'autres meilleures pratiques discutées dans cet article, les développeurs peuvent efficacement réduire la consommation de gas des contrats.
Cependant, il est important de noter que, lors de l'optimisation, les développeurs doivent opérer avec prudence afin d'éviter d'introduire des failles de sécurité. Lors du processus d'optimisation du code et de réduction de la consommation de gas, la sécurité inhérente des contrats intelligents ne doit jamais être sacrifiée.
[2] :
[3] :
[4] :
:precompiled