Vous avez peut-être rencontré quelques conseils Solidity pour améliorer vos compétences en code afin d'économiser de l'essence, mais aujourd'hui, je souhaite me concentrer davantage sur la façon dont la compréhension de la machine virtuelle Ethereum peut efficacement vous faire économiser des coûts d'essence sur vos contrats intelligents.
Puisque nous allons nous plonger dans Ethereum, je vais laisser ici l'extrait de son Livre Jaune qui précise les coûts de gaz des opcodes, et au cours de l'article nous y ferons référence.
Astuce n°1 : accès à froid VS accès à chaud
Gcoldsload : 2 100 gaz
Gwarmaccess : 100 gaz
Nous avons là notre premier OPCODES, le premier précise combien il en coûte pour accéder à une variable pour la première fois (ou accès à froid) tandis que le second précise combien il en coûte pour accéder à la variable une deuxième fois et plus (accès à chaud). ). Comme vous pouvez le constater, la différence de prix est assez importante, donc comprendre cela peut faire une grande différence dans les coûts des transactions de votre contrat intelligent. Voyons un exemple.
La mise en cache des données dans une fonction dans Solidity peut entraîner une consommation de gaz inférieure, même si cela nécessite plus de lignes de code. Dans ce cas, il s'agit de changer l'emplacement de la baie et, au lieu de l'utiliser à partir du stockage et donc d'y accéder à froid à chaque fois dans la boucle, il stocke la baie en mémoire où il est moins cher d'y accéder.
Conseil n°2 : Valeurs nulles ou non nulles et remboursements d'essence
Gsset = 20 000 gaz
Rsclear = {remise sur le prix d'exécution}
Changer une valeur de 0 à non nulle sur la blockchain Ethereum coûte cher, comme le montre le prix de Gsset, mais changer une valeur de non nulle à 0 peut vous donner un remboursement en valeur du gaz selon l'opcode Rsclear. Afin de ne pas bénéficier du remboursement, il est établi que vous ne pouvez vous faire rembourser qu'à hauteur de 20 % maximum du coût total de la transaction.
Vous pouvez trouver un tel scénario dans un scénario très courant sur la blockchain, qui met à jour le solde des adresses dans les contrats intelligents. Voyons un exemple de chacun :
Dans le premier exemple de contrat ZeroToNonZero, non nul à non nul (5 000 gaz*) + zéro à non nul (20 000 gaz) = 25 000 gaz
Dans le deuxième exemple de contrat NonZeroToZero, non nul à zéro (5 000 gaz*) + zéro à non nul (20 000 gaz) — Remboursement (4 800 gaz) = 21 200 gaz
*2 100 (Gcolssload) + 2 900 (Gsreset) = 5 000 gaz
Astuce n°3 : l’ordre des variables d’état est important
Le stockage est comme une structure de données clé-valeur qui contient les valeurs des variables d'état d'un contrat intelligent Solidity.
Vous pouvez considérer le stockage comme un tableau qui vous aidera à visualiser cela. Chaque espace de ce « tableau » de stockage est appelé un emplacement et contient 32 octets (256 bits) de données et chaque variable d'état déclarée dans le contrat intelligent occupera un emplacement en fonction de sa position de déclaration et de son type.
Tous les types de données n'utilisent pas les 32 octets de chaque emplacement, car certains types de données (bool, uint8, adresse…) en prennent moins.
L'astuce ici est que si deux/trois variables ou plus ensemble font 32 octets ou moins, le compilateur de Solidity essaiera de les regrouper dans un seul emplacement, mais ces variables doivent être définies les unes à côté des autres.
Ici, nous utilisons les types de données bool (1 octet), address (20 octets) et uint256 (32 octets). Ainsi, connaissant la taille de ces variables, vous pouvez facilement comprendre que dans le premier exemple du contrat TwoSlots puisque nous avons bool et adresse ensemble (1 + 20 = 21 octets, soit moins de 32 octets), elles occuperont un emplacement. Sur le contrat ThreeSlots, puisque bool et uint256 ne peuvent pas être dans le même emplacement (1 + 32 = 33 octets, ce qui est plus grand que la capacité de l'emplacement), nous utiliserons au total trois emplacements.
Maintenant, pourquoi est-ce si important ?
L'opcode SLOAD coûte 2 100 gas et il est utilisé pour lire à partir des emplacements de stockage. Par conséquent, si vous pouvez stocker les variables dans moins d'emplacements, vous finirez par économiser du gas.
Astuce n°4 : uint256 est moins cher que uint8
Nous avons appris dans l'astuce n°3 que uint256 (256 bits = 32 octets) occupe à lui seul un emplacement et nous avons également appris que uint8 fait moins de 32 octets. Ainsi, même s'il est assez simple que 8 bits soient plus petits que 256 bits, pourquoi uint256 est-il moins cher ?
Pour comprendre qu'il est important de savoir que si une variable ne remplit pas elle-même tout l'emplacement et si cet emplacement n'est rempli par aucune autre variable, l'EVM va remplir le reste des bits restants avec des « 0 » afin de pouvoir le manipuler.
Cet ajout « 0 » effectué par l'EVM coûtera du gaz, ce qui signifie que pour économiser du gaz de transaction, il est préférable d'utiliser uint256 au lieu de uint8.
__________________
J'espère qu'en découvrant ces conseils pour réduire les coûts de gaz dans vos contrats intelligents, vous avez également appris un peu comment fonctionne l'EVM.
__________________
Twitter @TheBlockChainer pour trouver plus de mises à jour quotidiennes sur les contrats intelligents, la sécurité Web3, la solidité, l'audit des contrats intelligents, et plus encore.
__________________