Passer au contenu principal

Envoyer des transactions en utilisant Web3

transactions
web3.js
Alchemy
Débutant
Elan Halpern
4 novembre 2020
11 minutes de lecture

Ceci est un guide pour débutants sur l'envoi de transactions Ethereum en utilisant Web3. Il y a trois étapes principales pour envoyer une transaction sur la chaîne de blocs Ethereum : créer, signer et diffuser. Nous allons passer en revue ces trois étapes, en espérant répondre à toutes vos questions ! Dans ce tutoriel, nous utiliserons Alchemy (opens in a new tab) pour envoyer nos transactions sur la chaîne Ethereum. Vous pouvez créer un compte Alchemy gratuit ici (opens in a new tab).

REMARQUE : Ce guide concerne la signature de vos transactions sur le backend de votre application. Si vous souhaitez intégrer la signature de vos transactions sur le frontend, consultez l'intégration de Web3 avec un fournisseur de navigateur (opens in a new tab).

Les bases

Comme la plupart des développeurs de chaînes de blocs à leurs débuts, vous avez peut-être fait des recherches sur la façon d'envoyer une transaction (quelque chose qui devrait être assez simple) et vous êtes tombé sur une pléthore de guides, chacun disant des choses différentes et vous laissant un peu dépassé et confus. Si vous êtes dans ce cas, ne vous inquiétez pas ; nous y sommes tous passés à un moment donné ! Donc, avant de commencer, mettons les choses au clair :

1. Alchemy ne stocke pas vos clés privées

  • Cela signifie qu'Alchemy ne peut pas signer et envoyer de transactions en votre nom. La raison en est des fins de sécurité. Alchemy ne vous demandera jamais de partager votre clé privée, et vous ne devriez jamais partager votre clé privée avec un nœud hébergé (ni avec personne d'autre d'ailleurs).
  • Vous pouvez lire depuis la chaîne de blocs en utilisant l'API principale d'Alchemy, mais pour y écrire, vous devrez utiliser autre chose pour signer vos transactions avant de les envoyer via Alchemy (il en va de même pour tout autre service de nœud).

2. Qu'est-ce qu'un « signataire » ?

  • Les signataires signeront les transactions pour vous en utilisant votre clé privée. Dans ce tutoriel, nous utiliserons Alchemy Web3 (opens in a new tab) pour signer notre transaction, mais vous pourriez également utiliser n'importe quelle autre bibliothèque Web3.
  • Sur le frontend, un bon exemple de signataire serait MetaMask (opens in a new tab), qui signera et enverra des transactions en votre nom.

3. Pourquoi dois-je signer mes transactions ?

  • Chaque utilisateur qui souhaite envoyer une transaction sur le réseau Ethereum doit signer la transaction (en utilisant sa clé privée), afin de valider que l'origine de la transaction est bien celle qu'elle prétend être.
  • Il est extrêmement important de protéger cette clé privée, car y avoir accès accorde un contrôle total sur votre compte Ethereum, vous permettant (ou à toute personne y ayant accès) d'effectuer des transactions en votre nom.

4. Comment protéger ma clé privée ?

  • Il existe de nombreuses façons de protéger votre clé privée et de l'utiliser pour envoyer des transactions. Dans ce tutoriel, nous utiliserons un fichier .env. Cependant, vous pourriez également utiliser un fournisseur distinct qui stocke les clés privées, utiliser un fichier de magasin de clés, ou d'autres options.

5. Quelle est la différence entre eth_sendTransaction et eth_sendRawTransaction ?

eth_sendTransaction et eth_sendRawTransaction sont toutes deux des fonctions de l'API Ethereum qui diffusent une transaction sur le réseau Ethereum afin qu'elle soit ajoutée à un futur bloc. Elles diffèrent dans la façon dont elles gèrent la signature des transactions.

Lors de l'utilisation de Web3, eth_sendRawTransaction est accessible en appelant la fonction web3.eth.sendSignedTransaction (opens in a new tab).

C'est ce que nous utiliserons dans ce tutoriel.

6. Qu'est-ce que la bibliothèque Web3 ?

D'accord, maintenant que nous avons répondu à quelques-unes de ces questions, passons au tutoriel. N'hésitez pas à poser des questions à tout moment sur le Discord (opens in a new tab) d'Alchemy !

7. Comment envoyer des transactions sécurisées, privées et optimisées en gaz ?

REMARQUE : Ce guide nécessite un compte Alchemy, une adresse Ethereum ou un portefeuille MetaMask, NodeJs et npm installés. Si ce n'est pas le cas, suivez ces étapes :

  1. Créer un compte Alchemy gratuit (opens in a new tab)
  2. Créer un compte MetaMask (opens in a new tab) (ou obtenir une adresse Ethereum)
  3. Suivre ces étapes pour installer NodeJs et NPM (opens in a new tab)

Étapes pour envoyer votre transaction

1. Créer une application Alchemy sur le réseau de test Sepolia

Accédez à votre tableau de bord Alchemy (opens in a new tab) et créez une nouvelle application, en choisissant Sepolia (ou tout autre réseau de test) pour votre réseau.

2. Demander des ETH au faucet Sepolia

Suivez les instructions sur le faucet Sepolia d'Alchemy (opens in a new tab) pour recevoir des ETH. Assurez-vous d'inclure votre adresse Ethereum Sepolia (depuis MetaMask) et non celle d'un autre réseau. Après avoir suivi les instructions, vérifiez que vous avez bien reçu les ETH dans votre portefeuille.

3. Créer un nouveau répertoire de projet et y accéder avec cd

Créez un nouveau répertoire de projet depuis la ligne de commande (terminal pour Mac) et accédez-y :

mkdir sendtx-example
cd sendtx-example

4. Installer Alchemy Web3 (ou toute autre bibliothèque Web3)

Exécutez la commande suivante dans le répertoire de votre projet pour installer Alchemy Web3 (opens in a new tab) :

Remarque : si vous souhaitez utiliser la bibliothèque Ethers.js, suivez les instructions ici (opens in a new tab).

npm install @alch/alchemy-web3

5. Installer dotenv

Nous utiliserons un fichier .env pour stocker en toute sécurité notre clé d'API et notre clé privée.

npm install dotenv --save

6. Créer le fichier .env

Créez un fichier .env dans le répertoire de votre projet et ajoutez ce qui suit (en remplaçant « your-api-url » et « your-private-key ») :

  • Pour trouver l'URL de votre API Alchemy, accédez à la page des détails de l'application que vous venez de créer sur votre tableau de bord, cliquez sur « View Key » dans le coin supérieur droit, et récupérez l'URL HTTP.
  • Pour trouver votre clé privée en utilisant MetaMask, consultez ce guide (opens in a new tab).
API_URL = "your-api-url"
PRIVATE_KEY = "your-private-key"
Ne commitez pas .env ! Assurez-vous de ne jamais partager ou exposer votre fichier .env à qui que ce soit, car vous compromettriez vos secrets en le faisant. Si vous utilisez un système de contrôle de version, ajoutez votre .env à un fichier gitignore.

7. Créer le fichier sendTx.js

Super, maintenant que nos données sensibles sont protégées dans un fichier .env, commençons à coder. Pour notre exemple d'envoi de transaction, nous allons renvoyer des ETH au faucet Sepolia.

Créez un fichier sendTx.js, c'est là que nous configurerons et enverrons notre exemple de transaction, et ajoutez-y les lignes de code suivantes :

Assurez-vous de remplacer l'adresse à la ligne 6 par votre propre adresse publique.

Maintenant, avant de nous lancer dans l'exécution de ce code, parlons de certains de ses composants.

  • nonce : La spécification du nonce est utilisée pour garder une trace du nombre de transactions envoyées depuis votre adresse. Nous en avons besoin pour des raisons de sécurité et pour empêcher les attaques par rejeu (opens in a new tab). Pour obtenir le nombre de transactions envoyées depuis votre adresse, nous utilisons getTransactionCount (opens in a new tab).
  • transaction : L'objet de la transaction comporte quelques aspects que nous devons spécifier :
    • to : C'est l'adresse à laquelle nous voulons envoyer des ETH. Dans ce cas, nous renvoyons des ETH au faucet Sepolia (opens in a new tab) que nous avons initialement sollicité.
    • value : C'est le montant que nous souhaitons envoyer, spécifié en Wei où 10^18 Wei = 1 ETH.
    • gas : Il existe de nombreuses façons de déterminer la bonne quantité de gaz à inclure dans votre transaction. Alchemy dispose même d'un webhook de prix du gaz (opens in a new tab) pour vous avertir lorsque le prix du gaz tombe en dessous d'un certain seuil. Pour les transactions sur le Réseau principal, il est de bonne pratique de vérifier un estimateur de gaz comme ETH Gas Station (opens in a new tab) pour déterminer la bonne quantité de gaz à inclure. 21000 est la quantité minimale de gaz qu'une opération sur Ethereum utilisera, donc pour nous assurer que notre transaction sera exécutée, nous mettons 30000 ici.
    • nonce : voir la définition du nonce ci-dessus. Le nonce commence à compter à partir de zéro.
    • [OPTIONNEL] data : Utilisé pour envoyer des informations supplémentaires avec votre transfert, ou pour appeler un contrat intelligent, non requis pour les transferts de solde, consultez la remarque ci-dessous.
  • signedTx : Pour signer notre objet de transaction, nous utiliserons la méthode signTransaction avec notre PRIVATE_KEY.
  • sendSignedTransaction : Une fois que nous avons une transaction signée, nous pouvons l'envoyer pour qu'elle soit incluse dans un bloc ultérieur en utilisant sendSignedTransaction.

Une remarque sur les données (data) Il existe deux principaux types de transactions qui peuvent être envoyées sur Ethereum.

  • Transfert de solde : Envoyer des ETH d'une adresse à une autre. Aucun champ de données n'est requis, cependant, si vous souhaitez envoyer des informations supplémentaires avec votre transaction, vous pouvez inclure ces informations au format HEX dans ce champ.
    • Par exemple, disons que nous voulions écrire le hash d'un document IPFS sur la chaîne Ethereum afin de lui donner un horodatage immuable. Notre champ de données devrait alors ressembler à data : web3.utils.toHex(‘IPFS hash‘). Et maintenant, n'importe qui peut interroger la chaîne et voir quand ce document a été ajouté.
  • Transaction de contrat intelligent : Exécuter du code de contrat intelligent sur la chaîne. Dans ce cas, le champ de données doit contenir la fonction intelligente que vous souhaitez exécuter, ainsi que tous les paramètres.

8. Exécuter le code en utilisant node sendTx.js

Revenez à votre terminal ou ligne de commande et exécutez :

node sendTx.js

9. Voir votre transaction dans la mempool

Ouvrez la page Mempool (opens in a new tab) dans votre tableau de bord Alchemy et filtrez par l'application que vous avez créée pour trouver votre transaction. C'est ici que nous pouvons observer notre transaction passer de l'état en attente (pending) à l'état miné (mined) (en cas de succès) ou à l'état abandonné (dropped) en cas d'échec. Assurez-vous de le garder sur « All » (Tout) afin de capturer les transactions « minées », « en attente » et « abandonnées ». Vous pouvez également rechercher votre transaction en cherchant les transactions envoyées à l'adresse 0x31b98d14007bdee637298086988a0bbd31184523.

Pour voir les détails de votre transaction une fois que vous l'avez trouvée, sélectionnez le hash de la transaction (tx hash), ce qui devrait vous amener à une vue qui ressemble à ceci :

Mempool watcher screenshot

À partir de là, vous pouvez voir votre transaction sur Etherscan en cliquant sur l'icône entourée en rouge !

Youpi ! Vous venez d'envoyer votre première transaction Ethereum en utilisant Alchemy 🎉

Pour des retours et des suggestions concernant ce guide, veuillez envoyer un message à Elan sur le Discord (opens in a new tab) d'Alchemy !

Publié à l'origine sur https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy (opens in a new tab)