Passer au contenu principal

Comment renvoyer une transaction avec un prix du gaz plus élevé à l'aide d'Ethers.js

Mis à jour le
26 novembre 2025

8 minutes de lecture

Avis important

Ce guide contient des références au testnet Kovan, qui n'est plus activement maintenu. Même si certaines étapes spécifiques liées à cette chaîne ne sont peut-être plus d'actualité, le processus global peut s'appliquer à d'autres chaînes. Nous vous recommandons d'étudier les alternatives actuelles pour votre mise en œuvre. Si vous souhaitez consulter une version mise à jour de ce guide, n'hésitez pas à nous le faire savoir!

Aperçu

Il arrive parfois que vous soumettiez une transaction sur Ethereum sans avoir alloué suffisamment de gaz, en raison d'une congestion du réseau ou d'un trop grand nombre de transactions en attente proposant un prix du gaz plus élevé que celui que vous avez proposé pour votre transaction. Si votre transaction est hautement prioritaire mais que votre allocation de gaz est faible, vous pourriez vous retrouver à devoir attendre des heures, voire des jours, avant que la transaction ne soit validée. Dans ces cas-là, vous devrez renvoyer une transaction avec une allocation de gaz plus élevée et le même nonce afin qu'elle soit validée le plus rapidement possible.

Dans ce guide, nous passerons en revue toute la terminologie et les informations relatives à l'envoi d'une transaction sur Ethereum et à la réémission de cette même transaction à l'aide d'Ethers.js sur l'un des réseaux de test d'Ethereum.

Qu'est-ce qu'une transaction sur Ethereum ?

Nous effectuons une transaction chaque fois que nous souhaitons ajouter, mettre à jour ou modifier quelque chose sur le réseau Ethereum. En substance, une transaction est le moyen par lequel le monde réel interagit avec la blockchain Ethereum. Pour chaque transaction effectuée sur le réseau Ethereum, nous devons payer des frais appelés « gas ». Le gas s'exprime soit en wei (la plus petite unité de l'ETH), soit en gwei.

Types de transactions sur Ethereum

Il existe trois types courants de transactions sur le réseau Ethereum :

  1. Une transaction ordinaire, qui consiste en un transfert d'ETH/ether d'un compte à un autre.
  2. Une transaction créant un contrat est le type de transaction au cours de laquelle un contrat intelligent est déployé sur le réseau de la blockchain Ethereum.
  3. Une transaction qui fait appel à un contrat : cette transaction est envoyée avec certaines données et sert à interroger un contrat intelligent déjà déployé ou à interagir avec celui-ci.

Paramètres d'une transaction Ethereum type

  • de : l'adresse de l'expéditeur, une adresse de 20 octets correspondant au compte à l'origine de la transaction.
  • à : l'adresse du destinataire, une adresse de 20 octets correspondant au compte du destinataire ou à un compte de contrat.
  • valeur : il s'agit du montant en ETH transféré lors de la transaction d'un compte à un autre.
  • data : ce champ contient le bytecode des transactions de déploiement de contrats. Pour l'exécution d'une fonction de contrat, il contient la signature de la fonction et les arguments encodés. Ce champ n'est pas nécessaire et reste vide dans les transactions de transfert de fonds.
  • gasLimit : Il s'agit du montant maximal, exprimé en wei, qu'une transaction peut utiliser comme gas.
  • gasPrice : Il s'agit du montant en wei que l'expéditeur est prêt à payer pour la transaction.
  • chainId : il s'agit de l'identifiant réseau de votre nœud Ethereum (mainnet : 1, Rinkeby : 4, Kovan : 42, etc.)
  • nonce : Il s'agit du nombre de transactions envoyées par une adresse donnée. Chaque fois qu'une adresse envoie une transaction, la valeur de nonce augmente de 1.

Déroulement des transactions sur Ethereum

  • Créer un objet de transaction et lui fournir tous les paramètres nécessaires.
  • Signature de la transaction à l'aide de la clé privée de l'expéditeur.
  • Envoi de la transaction vers le réseau de la blockchain Ethereum à l'aide d'un nœud Ethereum.

Signature d'une transaction

Signer une transaction consiste à générer une signature sur un objet de transaction à l'aide de la clé privée de l'expéditeur. Si vous souhaitez en savoir plus sur la signature et la validation dans Ethereum, voici quelques excellents articles : « Signing and Verifying Ethereum Signatures » (Signature et vérification des signatures Ethereum) par Yos et « Ethereum : Signing and Validating » (Ethereum : signature et validation) par Angello Pozo.

Maintenant que nous comprenons mieux le fonctionnement des transactions sur Ethereum, essayons d'en envoyer une nous-mêmes.

Prérequis

  • Node.js est installé sur votre système
  • Un éditeur de texte
  • Terminal, également appelé « ligne de commande »

Installation des outils nécessaires.

Nous utiliserons NodeJS pour gérer notre bibliothèque de modules et pour travailler avec le fichier JavaScript. Pour vérifier si NodeJS est installé sur votre système, ouvrez un terminal et exécutez la commande suivante :

$ node -v

Si ce n'est pas déjà installé, vous pouvez télécharger la version LTS de NodeJS depuis le site officiel.

Pour envoyer une transaction, nous allons utiliser un petit bout de code JavaScript, ainsi que la bibliothèque ethers.js (assurez-vous qu'il s'agit bien de la version 5.7). Vous pouvez l'installer avec npm depuis la ligne de commande ou le terminal :

$ npm install --save ethers@5.7

Le problème le plus courant à cette étape est une erreur interne liée à `node-gyp`. Vous pouvez suivre les instructions d'installation de node-gyp disponibles ici.

Un autre problème courant est un cache obsolète. Pour vider votre cache npm, il vous suffit de saisir la commande suivante dans votre terminal :

$ npm cache clean

Vous pouvez consulter notre guide sur ethers.js pour en savoir plus sur cette bibliothèque.

Créer un portefeuille et obtenir un peu d'ETH à des fins de test

Maintenant, créons notre propre portefeuille. Pour cela, commencez par créer un fichier index.js ou un fichier JavaScript portant le nom de votre choix. Vous pouvez copier-coller ce code dans votre éditeur de code :

var éthers = require('ethers');  
var cléPrivée = "0x0111111111111111111122222222222222222223333333333333333333344445";
var wallet = new ethers.Portefeuille(clé privée);
console.log("Adresse : " + wallet.adresse);

Voyons ce qui se passe ici : importation de la bibliothèque ethers.js que nous avons installée précédemment (ligne 1),  création d'une clé privée spécifique à notre portefeuille ; vous devrez en créer une vous-même, qui peut être n'importe quel nombre, mais assurez-vous qu'elle comporte le même nombre de chiffres que ci-dessus (ligne 2), création d'une instance de portefeuille avec ethers à l'aide de la clé privée (ligne 3), affichage de l'adresse de notre portefeuille avec le texte « Address » dans la console (ligne 4).

Maintenant, exécutez le fichier à l'aide de la commande suivante :

$ node index.js

Si tout se passe bien, le résultat affiché dans la fenêtre du terminal devrait ressembler à ceci :

Adresse : 0x3f5D3070Fc7924479B5e367a83EC2b284E9c4e04

Comme chaque transaction nécessite du « gas » à titre de frais, et qu'il nous en faudra pour envoyer cette transaction, ajoutons un peu d'ETH de test dans notre portefeuille. Pour cela, nous allons utiliser un nœud Kovan. Rendez-vous donc sur ce « faucet » Kovan pour obtenir de l'ETH de test, collez l'adresse de portefeuille que vous avez obtenue en exécutant le code ci-dessus, puis cliquez sur « send me KETH ! ». 

Remarque : il s'agit d'ETH de test, qui n'ont aucune valeur marchande.

Configurer votre point de terminaison Quicknode pour Ethereum

Pour ce qui nous intéresse aujourd'hui, nous pouvons utiliser pratiquement n'importe quel client Ethereum, tel que Geth ou OpenEthereum (anciennement Parity). Pour démarrer un nœud Ethereum par nos propres moyens, nous devons d'abord choisir un client et le configurer ; la synchronisation et la maintenance d'un nœud Ethereum constituent une tâche ardue ; la synchronisation d'un nœud complet Ethereum peut prendre plusieurs jours.

Comme cela s'avère un peu trop compliqué pour un simple envoi de transaction, nous allons utiliser un point de terminaison gratuit de Quicknode pour simplifier les choses. Une fois que vous aurez créé votre point de terminaison Ethereum gratuit, copiez l'URL de votre fournisseur HTTP : 

Dans ce guide, nous utilisons un nœud du testnet Kovan.

Capture d'écran du point de terminaison Quicknode Kovan

Tu en auras besoin plus tard, alors copie-le et enregistre-le.

Envoi et renvoi d'une transaction

Nous disposons désormais d'un portefeuille contenant un peu d'ETH à titre de test. Envoyons donc une transaction pour transférer un peu d'ETH vers un autre compte ou portefeuille. Pour cela, ajoutons quelques lignes supplémentaires à notre fichier index.js. Vous pouvez copier-coller ce code dans votre éditeur de code :

var ethers = require('ethers');  
var url = 'ADD_YOUR_ETHEREUM_NODE_URL';
var customHttpProvider = new ethers.providers.JsonRpcProvider(url);
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var wallet = new ethers.Wallet(privateKey);
console.log("Address: " + wallet.address);
tx = {
to: "0x6E0d01A76C3Cf4288372a29124A26D4353EE51BE",
value: ethers.utils.parseEther("0.05"),
chainId: 42,
nonce: 3
}
customHttpProvider.estimateGas(tx).then(function(estimate) {
tx.gasLimit = estimate;
tx.gasPrice = ethers.utils.parseUnits("0.14085197", "gwei");
wallet.signTransaction(tx).then((signedTX)=>{
customHttpProvider.sendTransaction(signedTX).then(console.log);
});
});

N'hésitez donc pas à remplacer `ADD_YOUR_ETHEREUM_NODE_URL` par le fournisseur HTTP indiqué dans la section ci-dessus. 

Une brève explication du code ci-dessus : nous importons la bibliothèque « ethers » que nous avons installée précédemment (ligne 1), nous configurons l'URL de notre nœud Ethereum (ligne 2), nous instancions une instance « ethers JsonRpcProvider » (ligne 3), nous créons une clé privée spécifique à notre portefeuille (vous devrez en créer une vous-même ; elle peut comporter n'importe quel nombre de chiffres, mais assurez-vous qu'elle contienne toujours le même nombre de chiffres) (ligne 4), créons une instance de portefeuille avec ethers à l’aide de la clé privée (ligne 5), affichons l’adresse de notre portefeuille avec le texte « Address » dans la console (ligne 6), créons un objet de transaction et ajoutons le champ « to » avec l’adresse du destinataire ; vous pouvez générer une adresse aléatoire à l’aide de `var wallet = Wallet.createRandom();`, un champ « value » indiquant la valeur en ETH à envoyer, un champ « chainId » défini ici sur 42 puisque nous utilisons Kovan, un champ « nonce » défini sur 3 (lignes 7 à 12), estimation du gasLimit via notre nœud et définition du prix du gaz (lignes 13 à 15), en signant l’objet de transaction avec la clé privée de notre portefeuille et en l’envoyant, tout en affichant la transaction dans la console (lignes 16 à 18).

Essayons ça :

$ node index.js

On obtiendra un résultat similaire à celui-ci :

Sortie du fichier index.js de Node

Copiez la chaîne de caractères du champ « hash » (par exemple « 0xe49c8122656c612bf5f1e10b251f56671acf01d831b6876c37c5a52053035642 ») et collez-la dans le champ de recherche d'Etherscan Kovan pour vérifier l'état de la transaction. Vous verrez que la transaction n’a pas encore été ajoutée au nouveau bloc de la blockchain et qu’elle a le statut « en attente ». Cela s’explique par le fait que nous avons saisi une valeur de gas nettement trop faible.

Maintenant, essayons d'envoyer la même transaction avec le même nonce, mais en augmentant cette fois-ci la valeur du gas ; remplacez la valeur de gasPrice à la ligne 15 du code par « 2.14085197 » au lieu de « 0.14085197 », puis relancez le code :

$ node index.js 

Copiez la chaîne de hachage figurant dans le nouveau résultat et collez-la dans le champ de recherche de Kovan Etherscan pour vérifier le statut de la transaction. Cette fois-ci, notre transaction sera intégrée au bloc et affichera un statut « réussi », car nous l'avons envoyée en augmentant la valeur de gasPrice de manière appropriée.

Remarque : il est important de noter que la valeur « nonce » est identique dans les deux transactions. Comme mentionné précédemment, le nonce indique le nombre de transactions effectuées par une adresse Ethereum. Pour renvoyer une transaction avec un coût de gaz plus élevé, vous devez utiliser le même nonce que celui de la transaction d’origine. Si vous utilisez un nonce plus élevé, cela constituera une nouvelle transaction, ce qui entraînera une dépense d’ETH supérieure à celle que vous aviez prévue.

Conclusion

Ainsi, comme nous l'avons vu dans l'exemple ci-dessus, le prix du gaz d'une transaction doit être compétitif pour que celle-ci soit validée. Les mineurs de la blockchain fixent le prix du gaz en fonction de l'espace disponible dans le bloc et du montant que toutes les transactions sont prêtes à payer pour occuper cet espace. Lorsqu'une transaction présente un prix du gaz inférieur au seuil fixé, elle n'est pas validée. Les transactions dont le prix du gaz est plus élevé que celui des autres sont validées rapidement.

Abonnez-vous à notre newsletter pour découvrir d'autres articles et guides sur Ethereum. Si vous avez des commentaires, n'hésitez pas à nous contacter sur Twitter, et vous pouvez toujours discuter avec nous si vous avez une question via notre serveur communautaire sur Discord. On y trouve certains des développeurs les plus géniaux qui soient, merci :)

Partager ce guide