Utiliser le réseau Ethereum n’est pas gratuit. Pour chaque utilisation du réseau (envoi d’Ether, tokens…) vous allez consommer du Gas. Ce Gas correspond aux frais de transaction. Contrairement à Bitcoin, où vous payez des frais suivant la taille de la transaction, avec Ethereum, vous allez payer des frais suivant sa complexité.
Les applications décentralisées sur le réseau Ethereum sont exécutées sur chaque ordinateur du réseau.
Lorsque vous achetez des Tokens par exemple, un Smart Contract va être exécuté pour associer votre adresse à un montant en Token. Ce Smart Contract va être exécuté sur chaque ordinateur du réseau Ethereum.
Le coût de l’exécution permet de ne pas spammer le réseau. Si quelqu’un décide de faire une boucle infini dans un Smart Contract par exemple, ce sont tous les ordinateurs du réseau qui vont faire cette boucle. Le coût en gas va augmenter au fil des boucles effectuées, et la personne se retrouvera à court d’Ether au bout d’un moment.
Le coût en gas permet de sécuriser le réseau pour ne pas abuser de celui-ci.
Pour écrire un Smart Contract, le langage de programmation principal est Solidity. Le code écrit avec Solidity est compilé en une séquence d’opérations, avant d’être déployé dans la Blockchain Ethereum. Chaque opération a un coût fixe en gas.
Ici les opérations sont : « DUP1« , « PUSH 0 » etc.
Lorsque vous utilisez le réseau Ethereum, votre transaction va exécuter des opérations. Vous allez donc dépenser des unités de gas en fonction des opérations exécutées. Plus il y a d’opérations exécutées, plus vous consommez du gas.
Il serait impossible de modifier le coût des opérations à chaque fois que la valeur de l’Ether change. C’est pourquoi, un coût en Ether doit être associé à 1 unité de gas. C’est le gas price.
Comment convertir le gas en Ether ? Le gas price représente le coût d’une unité de gas en Ether :
Frais de transaction = montant total en unité de gas (pour chaque opération exécutée) x gas price
Pour faire simple, plus vous exécutez de code, plus vous payez de frais.
Le gas et le gas price peuvent être comparés à l’essence que vous consommez avec votre voiture. La capacité de votre réservoir ne bouge pas (comme le coût des opérations). Si votre réservoir fait 50L, il fera toujours 50L. Par contre, le coût de l’essence bouge (tout comme le gas price).
Vos frais en essence sont :
Frais d’essence = volume d’essence à mettre dans le réservoir * prix de l’essence
Retrouvez le prix du gas en temps réel sur : ethgasstation
Le gas limit permet de spécifier la valeur limite que vous vous permettez de payer, lorsque vous allez utiliser le réseau.
Par défaut le coût minimum d’une transaction est de 21000 gas. C’est le cas lorsque vous envoyez de l’Ether vers un autre compte. C’est une transaction simple, le coût en gas s’élève donc à 21000 gas. Pour une interaction avec un Smart Contract, vous allez dépenser : 21 000 gas + le coût en gas des opérations exécutées.
Si vous spécifiez une limite trop faible et que la limite de gas est atteinte, l’exécution s’arrête, et votre transaction est annulée. Vous payez tout de même les ethers, mais la transaction n’a jamais eu lieu. Si la limite n’est pas atteinte, vous payez seulement le gas nécessaire à l’exécution.
« Il n’est pas recommandé de mettre une grande limite pour être sûr que la transaction fonctionne. Si le Smart Contract contient un bug inattendu, vous pourriez être amené à payer une somme conséquente. »
Je vais utiliser l’IDE remix pour cet exemple. Vous pouvez y écrire vos Smart Contracts et les tester facilement. Reprenons le Smart Contract du schéma plus haut :
Je vais utiliser la fonction « setNumber », qui se charge simplement de stocker un nombre dans le Smart Contract. Elle prend un nombre en paramètre. Je lui passe 5, et je fixe le gas limit à 3 000 000. Voici le résultat de la transaction :
Dans ce tableau, on va s’intéresser à 5 lignes :
Ici, j’ai donc payé 41 669 gas pour stocker un nombre dans mon Smart Contract. Dans ces 41 669 gas, j’ai payé 20 205 gas pour le code exécuté dans la fonction setNumber.
Si on fait le calcul, il reste 41 669 – 20 205 = 21 464 gas.
Pourquoi ai-je payé ces 21 464 gas en plus ? Comme dit précédemment, toute transaction coûte forcément 21 000 gas de base. Je ne rentrerais pas dans les détails dans cet article, mais j’ai également payé du gas pour appeler la fonction et lui passer le nombre 5. Ces frais sont donc de 464 gas.
« Il est possible de calculer ces frais en se servant de la ligne « input », qui contient le code hexadécimal de l’input de la transaction. On peut y retrouver le nom de la fonction appelée et les paramètres passés (ici 5). Il y a ensuite un calcul à faire suivant le nombre de chiffre zéro et non zéro contenu dans ce code »
J’ai donc payé les frais suivant :
Ce qui fait un total de 21000 + 464 + 20 205 = 41 669 gas.
Imaginons maintenant que le coût du gas price à ce moment là soit de 6. Mes frais s’élèverait donc à 41 669 x 6 = 250 014 Gwei.
Gwei est une unité de mesure en Ether : 1 Ether = 10^8 Gwei. Pour passer de Gwei en Ether, il faut donc diviser par 10^8. J’ai donc payé la somme de 250 014/10^8 = 0,000250014 Ether.
Dans cet exemple, le coût de la transaction (41 669 gas) ne dépasse pas le gas limit que j’ai fixé (3 000 000 gas). La transaction s’est donc bien passée. Voila ce qui ce serait passé avec un gas limit trop faible :
Reprenons les lignes du tableau :
Comme j’ai défini un gas limit trop faible, la transaction a échouée. L’exécution s’est arrêtée à 22 000 gas dépensé. Le nombre 5 n’est donc pas stocké, mais j’ai tout de même payé 22 000 gas.