Envoyer des transactions en utilisant le Web3
Voici un guide à l'attention des débutants qui explique comment envoyer des transactions Ethereum en utilisant le Web3. Il y a trois étapes principales pour envoyer une transaction sur la blockchain Ethereum : créer, signer et diffuser. Nous allons passer en revue les trois en espérant répondre à toutes les questions que vous pourriez vous poser ! Dans ce tutoriel, nous utiliserons Alchemy(opens in a new tab) pour envoyer nos transactions sur la chaîne Ethereum. Vous pouvez créer gratuitement un compte sur Alchemy ici(opens in a new tab).
NOTE : Ce guide est destiné à signer vos transactions sur le backend de votre application. Si vous voulez intégrer la signature de vos transactions en 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 blockchain débutants, vous avez peut-être fait des recherches sur la façon d'envoyer une transaction (ce qui devrait être assez simple ) et vous êtes tombé sur une pléthore de guides, chacun décrivant des choses différentes, vous laissant quelque peu dépassé et désorienté. Si vous êtes dans ce cas, ne vous inquiétez pas, nous l'avons tous été à un moment ou à un autre ! Donc, avant de commencer, mettons certaines choses au clair :
1.Alchemy ne stocke pas vos clés privées
- Cela signifie qu'Alchemy ne peut pas signer et envoyer des transactions en votre nom. Ceci pour des raisons 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 quiconque d'ailleurs).
- Vous pouvez lire sur la blockchain en utilisant l'API Alchemy, mais pour y écrire vous devrez utiliser quelque chose d'autre afin de signer vos transactions par le biais d'Alchemy (c'est le cas pour tous les services d'accès à la blockchain).
2.Qu'est-ce qu'un « signataire » ?
- Les signataires signeront pour vous les transactions en utilisant votre clé privée. Dans ce tutoriel, nous utiliserons Alchemy web3(opens in a new tab) pour signer notre transaction, mais vous pouvez également utiliser n'importe quelle autre bibliothèque web3.
- En 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 souhaitant envoyer une transaction sur le réseau Ethereum doit signer la transaction (à l'aide de sa clé privée), afin de valider que l'origine de la transaction est bien celle qu'elle prétend être.
- Il est très important de protéger cette clé privée, car le fait d'y avoir accès vous donne le contrôle total de votre compte Ethereum, ce qui vous permet (ou à quiconque 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 allons utiliser un fichier
.env
. Cependant, vous pouvez également faire appel à un autre fournisseur qui stocke les clés privées, utiliser un fichier keystore, ou d'autres options.
5. Quelle est la différence entre eth_sendTransaction
et eth_sendRawTransaction
?
eth_sendTransaction
et eth_sendRawTransaction
sont des fonctions API Ethereum qui diffusent une transaction sur le réseau Ethereum afin qu'elle soit ajoutée à un bloc futur. Elles diffèrent dans la façon dont elles gèrent la signature des transactions.
eth_sendTransaction
(opens in a new tab) est utilisée pour envoyer des transactions non signées, ce qui signifie que le nœud auquel vous envoyez la transaction doit gérer votre clé privée pour pouvoir signer la transaction avant de la transmettre à la chaîne. Puisqu'Alchemy ne possède pas les clés privées de l'utilisateur, il ne prend pas en charge cette méthode.eth_sendRawTransaction
(opens in a new tab) est utilisée pour propager des transactions qui ont déjà été signées. Cela signifie que vous devez d'abord utilisersignTransaction(tx, private_key)
(opens in a new tab), puis passer le résultat danseth_sendRawTransaction
.
Lorsque vous utilisez web3, eth_sendRawTransaction
est accessible en appelant la fonction web3.eth.sendSignedTransaction(opens in a new tab).
C'est ce que nous utiliserons dans notre tutoriel.
6.Qu'est-ce que la bibliothèque web3 ?
- Web3.js est une bibliothèque de wrapper autour des appels standard JSON-RPC qui est couramment utilisée dans le développement Ethereum.
- Il existe de nombreuses bibliothèques web3 pour différents langages de programmation. Dans ce tutoriel, nous utiliserons Alchemy Web3(opens in a new tab), écrit en JavaScript. Vous pouvez explorer d'autres options ici(opens in a new tab), telles que ethers.js(opens in a new tab).
Bon, maintenant que nous avons clarifié ces points, 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, optimisées en termes de gaz et privées ? {how-to-send-secure-gas-optimized-and-private-transactions}
- Alchemy propose une suite d'APIs de transaction.(opens in a new tab). Vous pouvez les utiliser pour envoyer des transactions renforcées, simuler des transactions avant qu'elles ne se produisent, envoyer des transactions privées et d'autres optimisées en termes de gaz
- Vous pouvez également utiliser l'API Notify(opens in a new tab) pour être alerté lorsque votre transaction est retirée du mempool et ajoutée à la chaîne
NOTE : Ce guide nécessite un compte Alchemy, une adresse Ethereum ou un portefeuille MetaMask, ainsi que l'installation de NodeJs et npm. Si ce n’est pas le cas, procédez comme suit :
- Créez un compte Alchemy gratuitement(opens in a new tab)
- Créez un compte Metamask(opens in a new tab) (ou obtenez une adresse Ethereum)
- Suivez 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
Naviguez vers votre tableau de bord d'Alchemy(opens in a new tab) et créez une nouvelle application, en choisissant Sepolia (ou tout autre réseau de test) comme réseau.
2.Demander de l'ETH via le robinet Sepolia
Suivez les instructions sur le robinet Alchemy Sepolia(opens in a new tab) pour recevoir de l'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 reçu l'ETH dans votre portefeuille.
3. Créez un nouveau répertoire de projet et placez-y un cd
Créez un nouveau répertoire de projet à partir de la ligne de commande (terminal pour macs) et naviguez dans celui-ci :
1mkdir sendtx-example2cd sendtx-example
4.Installer Alchemy Web3 (ou n'importe quelle autre bibliothèque web3)
Exécutez la commande suivante dans votre dossier projet pour installer Alchemy Web3(opens in a new tab) :
Notez que si vous souhaitez utiliser la bibliothèque ethers.js, suivez les instructions ici(opens in a new tab).
1npm install @alch/alchemy-web3
5.Installer dotenv
Nous utiliserons un fichier .env
pour stocker en toute sécurité notre clé API et notre clé privée.
1npm install dotenv --save
6. Créer le fichier .env
Créez un fichier .env
dans votre répertoire de projet et ajoutez les éléments suivants (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 » (Voir clé) dans le coin supérieur droit et saisissez l’URL HTTP.
- Pour trouver votre clé privée sur MetaMask, consultez ce guide(opens in a new tab).
1API_URL = "your-api-url"2PRIVATE_KEY = "your-private-key"
.env
! Assurez-vous de ne jamais partager ou exposer votre fichier .env
avec quiconque, car vous compromettez vos secrets en le faisant. Si vous utilisez le contrôle de version, ajoutez votre .env
à un fichier gitignore(opens in a new tab).7. Créer le fichier sendTx.js
Super, maintenant que nous avons protégé nos données sensibles dans un fichier .env
, commençons à coder. Pour notre exemple d'envoi de transaction, nous renverrons l'ETH via le robinet Sepolia.
Créez un fichier sendTx.js
, dans lequel nous allons configurer et envoyer notre exemple de transaction et ajoutez-y les lignes de code suivantes :
1async function main() {2 require('dotenv').config();3 const { API_URL, PRIVATE_KEY } = process.env;4 const { createAlchemyWeb3 } = require("@alch/alchemy-web3");5 const web3 = createAlchemyWeb3(API_URL);6 const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: replace this address with your own public address78 const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // nonce starts counting from 0910 const transaction = {11 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // faucet address to return eth12 'value': 1000000000000000000, // 1 ETH13 'gas': 30000,14 'nonce': nonce,15 // optional data field to send message or execute smart contract16 };1718 const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);1920 web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {21 if (!error) {22 console.log("🎉 The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!");23 } else {24 console.log("❗Something went wrong while submitting your transaction:", error)25 }26 });27}2829main();Afficher tout
Veillez à remplacer l'adresse sur la ligne 6 par votre propre adresse publique.
Avant de nous lancer dans l’exécution de ce code, parlons ici de certains de ses composants.
nonce
: La spécification 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 éviter les attaques par répétition(opens in a new tab). Pour obtenir le nombre de transactions envoyées à partir de votre adresse, nous utilisons getTransactionCount(opens in a new tab).transaction
: L'objet de la transaction présente quelques aspects que nous devons spécifierto
: C'est l'adresse à laquelle nous voulons envoyer l'ETH. Dans notre cas, nous renvoyons l'ETH au robinet Sepolia(opens in a new tab) auquel nous avons initialement fait la demande.value
: C'est le montant que nous souhaitons envoyer, spécifié en Wei où 10^18 Wei = 1 ETH.gas
: Il existe plusieurs façons de déterminer la bonne quantité de gaz à inclure dans votre transaction. Alchemy dispose même d'un lien de rappel du prix du gaz(opens in a new tab) pour vous avertir lorsque le prix du gaz tombe sous un certain seuil. Pour les transactions sur le réseau principal, il est bon de recourir à un estimateur de gaz comme ETH Gas Station(opens in a new tab) pour déterminer la bonne quantité de gaz à intégrer. 21 000 est la quantité minimale de gaz qu'une opération sur Ethereum va utiliser. Ainsi, pour s'assurer que notre transaction sera exécutée, nous utiliserons ici 30 000 unités.nonce
: voir la définition de nonce ci-dessus. Nonce commence à compter à partir de zéro.- [OPTIONAL] données : 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 note ci-dessous.
signedTx
: Pour signer l'objet de notre transaction nous utiliserons la méthodesignTransaction
avec notrePRIVATE_KEY
sendSignedTransaction
: Une fois que nous disposons d'une transaction signée, nous pouvons l'envoyer pour être intégrée dans un bloc ultérieur en utilisantsendSignedTransaction
.
Remarque concernant les données Il existe deux types principaux de transactions qui peuvent être envoyées sur Ethereum.
- Transfert du 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.
- Imaginons par exemple que nous souhaitions écrire le hachage d'un document IPFS dans la chaîne Ethereum afin de lui donner un horodatage immuable. Notre champ de données devrait alors ressembler à des données :
web3.utils.toHex(‘IPFS hash‘)
. Et maintenant, toute personne peut interroger la chaîne et voir quand ce document a été ajouté.
- Imaginons par exemple que nous souhaitions écrire le hachage d'un document IPFS dans la chaîne Ethereum afin de lui donner un horodatage immuable. Notre champ de données devrait alors ressembler à des données :
- Transaction de contrat intelligent : Exécuter le code d'un 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 tout paramètre.
- Pour un exemple pratique, consultez l'Étape 8 de ce Tutoriel Hello World(opens in a new tab).
8. Exécuter le code en utilisant node sendTx.js
Retournez à votre terminal ou votre invite de ligne de commande et exécutez :
1node sendTx.js
9.Consulter votre transaction dans le Mempool
Ouvrez la page Mempool(opens in a new tab) dans votre tableau de bord Alchemy et filtrez avec l'application que vous avez créée pour trouver votre transaction. C'est là que nous pouvons observer le passage de l'état de notre transaction de l'état en attente à l'état miné (si la transaction a abouti) ou à l'état abandonné en cas d'échec. Veillez à opter pour « All » (Tous) afin de visualiser les transactions « mined » (minées), « pending » (en attente) et « dropped » (abandonnées). Vous pouvez également trouver votre transaction en recherchant les transactions envoyées à l'adresse 0x31b98d14007bdee637298086988a0bbd31184523
.
Pour afficher les détails de votre transaction une fois que vous l'avez trouvée, sélectionnez le hachage tx, qui devrait vous amener à une vue qui ressemble à ceci :
À partir de là, vous pouvez visualiser votre transaction sur Etherscan en cliquant sur l'icône cerclée en rouge !
Youpi ! Vous venez d’envoyer votre première transaction Ethereum en utilisant Alchemy 🎉
Pour des commentaires et des suggestions sur ce guide, veuillez envoyer un message à Elan sur le Discord d'Alchemy(opens in a new tab) !
Publié à l’origine sur https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy(opens in a new tab)
Dernière modification: @nhsz(opens in a new tab), 15 août 2023