Salt la conținutul principal

Sending Transactions Using Web3

tranzacțiiweb3.jsalchemy
Începător
Elan Halpern
Documentație Alchemy(opens in a new tab)
4 noiembrie 2020
9 minute de citit minute read

This is a beginner friendly guide to sending Ethereum transactions using web3. Există trei etape principale pentru a trimite o tranzacție în blockchain-ul Ethereum: crearea, semnarea și difuzarea. Le vom parcurge pe toate trei, în speranța că vom răspunde tuturor întrebărilor pe care le puteți avea! In this tutorial, we'll be using Alchemy(opens in a new tab) to send our transactions to the Ethereum chain. You can create a free Alchemy account here(opens in a new tab).

NOTE: This guide is for signing your transactions on the backend for your app, if you want to integrate signing your transactions on the frontend, check out integrating Web3 with a browser provider(opens in a new tab).

Noțiuni de bază

Ca majoritatea dezvoltatorilor de blockchain la început de drum, poate aţi făcut câteva cercetări despre cum să trimiteți o tranzacție (ar trebui să fie destul de simplu) și aţi nimerit într-o multitudine de ghiduri, fiecare spunând lucruri diferite, după care aţi rămas oarecum copleșit și încurcat. Dacă vă aflați într-o astfel de situație, nu vă faceți griji; cu toții am trecut prin aceasta la un moment dat! De aceea, înainte de a începe, haideți să lămurim câteva lucruri:

1.Alchemy nu stochează cheile dvs. private

  • Acest lucru înseamnă că Alchemy nu poate semna și trimite tranzacții în numele dumneavoastră. Aceasta din motive de securitate. Alchemy nu vă va solicita niciodată să vă partajați cheia privată și nu ar trebui să o partajați niciodată cu un nod găzduit (sau cu oricine altcineva).
  • You can read from the blockchain using Alchemy’s core API, but to write to it you’ll need to use something else to sign your transactions before sending them through Alchemy (this is the same for any other node service).

2.Ce este un „semnatar”?

  • Semnatarii vor semna tranzacțiile în locul dvs. folosind cheia dvs. privată. In this tutorial we’ll be using Alchemy web3(opens in a new tab) to sign our transaction, but you could also use any other web3 library.
  • Pe „frontend”, o bună exemplificare a unui semnatar ar fi „metamask”(opens in a new tab), care va semna și va trimite tranzacții în numele dvs.

3.De ce trebuie să-mi semnez tranzacțiile?

  • Orice utilizator care dorește să trimită o tranzacție în rețeaua Ethereum trebuie să semneze tranzacția (folosindu-şi cheia privată), pentru a valida în acest fel că persoana care a iniţiat tranzacţia este cea care pretinde a fi.
  • Este extrem de important să vă protejați această cheie privată, deoarece accesul la ea oferă control total asupra contului Ethereum, permițând (atât dvs., cât și oricărei alte persoane cu acces la ea) efectuarea de tranzacții în numele dvs.

4.Cum pot să-mi protejez cheia privată?

  • Sunt mai multe moduri de a vă proteja cheia privată și de a o utiliza pentru a trimite tranzacții. În acest tutorial vom folosi un fișier .env. Totuși, puteți utiliza și un furnizor separat care stochează chei private, puteți folosi un fișier de depozitare de chei (keystore) sau alte opțiuni.

5. Care este diferența dintre eth_sendTransaction și eth_sendRawTransaction?

eth_sendTransaction și eth_sendRawTransaction sunt amândouă funcții API Ethereum care transmit o tranzacție către rețeaua Ethereum, pentru ca aceasta să fie adăugată la un bloc viitor. Acestea diferă prin modul de gestionare a semnării tranzacțiilor.

Atunci când utilizați web3, este accesat eth_sendRawTransaction prin apelarea funcției „web3.eth.sendSignedTransaction”(opens in a new tab).

This is what we will be using in this tutorial.

6.Ce este biblioteca web3?

  • Web3.js este o bibliotecă de coduri de încapsulare (wrapper) în jurul apelurilor JSON-RPC standard, care se utilizează destul de des în dezvoltarea Ethereum.
  • Există mai multe biblioteci web3 pentru diferite limbaje. În acest tutorial vom folosi Alchemy Web3Web3(opens in a new tab), care este scrisă în JavaScript. Puteți verifica și alte opțiuni aici(opens in a new tab).

În regulă, acum că am eliminat câteva dintre aceste întrebări, haideți să trecem la tutorial. Feel free to ask questions anytime in the Alchemy discord(opens in a new tab)!

NOTE: This guide requires an Alchemy account, an Ethereum address or MetaMask wallet, NodeJs, and npm installed. Daca nu, urmați acești pași:

  1. Creați un cont gratuit Alchemy(opens in a new tab)
  2. Create MetaMask account(opens in a new tab) (or get an Ethereum address)
  3. Urmați aceste etape pentru a instala „NodeJs” și „NPM”(opens in a new tab)

Etapele de trimitere a tranzacției dvs.

1.Creați o aplicație Alchemy pe Rinkeby testnet

Navigați la Tabloul de bord Alchemy(opens in a new tab) și creați o nouă aplicație, alegând ca reţea Rinkeby (sau orice alt testnet).

2.Solicitați ETH de la „faucet-ul” Rinkeby

Follow the instructions on the Alchemy Rinkeby faucet(opens in a new tab) to receive ETH. Make sure to include your Rinkeby Ethereum address (from MetaMask) and not another network. After following the instructions, double-check that you’ve received the ETH in your wallet.

3. Creați un nou director pentru proiect și intrați în el prin cd

Creați un nou director pentru proiect din linia de comandă (terminal pentru mac-uri) și navigați în el:

1mkdir sendtx-example
2cd sendtx-example

4.Instalați Alchemy Web3 (sau orice bibliotecă web3)

Executați următoarea comandă în directorul proiectului dvs. pentru a instala Alchemy Web3(opens in a new tab):

1npm install @alch/alchemy-web3

5.Instalați „dotenv”

Vom folosi un fișier „.env” pentru a stoca în siguranță cheia API și cheia privată.

1npm install dotenv --save

6.Creați fișierul „.env”

Create a .env file in your project directory and add the following (replacing “your-api-url" and "your-private-key")

  • Pentru a găsi URL-ul API-ului Alchemy, navigați pe pagina de detalii a aplicației pe care tocmai ați creat-o în tabloul de bord, faceți clic pe "View Key" (Vizualizare cheie) în colțul din dreapta sus și luați URL-ul HTTP.
  • To find your private key using MetaMask, check out this guide(opens in a new tab).
1API_URL = "your-api-url"
2PRIVATE_KEY = "your-private-key"
Don't commit .env! Please make sure never to share or expose your .env file with anyone, as you are compromising your secrets in doing so. If you are using version control, add your .env to a gitignore(opens in a new tab) file.

7. Creați fișierul sendTx.js

Excelent, acum că avem datele noastre sensibile protejate într-un fișier „.env”, să începem codarea. Pentru exemplul nostru de trimitere a unei tranzacţii, vom trimite ETH înapoi la „faucet-ul” Rinkeby.

Creați un fișier sendTx.js, care este locul în care vom configura și trimite tranzacţia pe care am luat-o drept exwmplu și adăugați-i următoarele linii de cod:

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 address
7
8 const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // nonce starts counting from 0
9
10 const transaction = {
11 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // faucet address to return eth
12 'value': 1000000000000000000, // 1 ETH
13 'gas': 30000,
14 'nonce': nonce,
15 // optional data field to send message or execute smart contract
16 };
17
18 const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
19
20 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}
28
29main();
Afișează tot

Be sure to replace the address on line 6 with your own public address.

Now, before we jump into running this code, let's talk about some of the components here.

  • nonce : Specificația nonce este utilizată pentru a ține evidența numărului de tranzacții trimise de la adresa dvs. Avem nevoie de aceasta din motive de securitate și pentru a preveni atacurile de reluare(opens in a new tab). Pentru a obține numărul de tranzacții trimise de la adresa dvs., folosim „getTransactionCount”(opens in a new tab).
  • transaction: Obiectul parametrului „transaction” are câteva aspecte pe care trebuie să le specificăm
    • to: This is the address we want to send ETH to. În cazul de față, trimitem ETH înapoi la „faucet-ul” Rinkeby(opens in a new tab) de la care l-am solicitat inițial.
    • value: This is the amount we wish to send, specified in wei where 10^18 wei = 1 ETH
    • gas: There are many ways to determine the right amount of gas to include with your transaction. Alchemy even has a gas price webhook(opens in a new tab) to notify you when the gas price falls within a certain threshold. For Mainnet transactions, it's good practice to check a gas estimator like ETH Gas Station(opens in a new tab) to determine the right amount of gas to include. 21.000 este cantitatea minimă de gaz pe care o foloeşte o operațiune pe Ethereum, de aceea, pentru a ne asigura că tranzacția noastră va fi executată, punem 30.000 aici.
    • nonce: a se vedea definiția nonce-ului de mai sus. Nonce starts counting from zero.
    • [OPTIONAL] data: Used for sending additional information with your transfer, or calling a smart contract, not required for balance transfers, check out the note below.
  • signedTx: Pentru a semna obiectul tranzacției noastre, vom folosi metoda signTransaction cu cheia noastră privată PRIVATE_KEY
  • sendSignedTransaction: Once we have a signed transaction, we can send it off to be included in a subsequent block by using sendSignedTransaction

A Note on data There are a two main types of transactions that can be sent in Ethereum.

  • Balance transfer: Send eth from one address to another. No data field required, however, if you'd like to send additional information alongside your transaction, you can include that information in HEX format in this field.
    • For example, let's say we wanted to write the hash of an IPFS document to the ethereum chain in order to give it an immutable timestamp. Our data field should then look like data: web3.utils.toHex(‘IPFS hash‘). And now anyone can query the chain and see when that document was added.
  • Smart contact transaction: Execute some smart contract code on the chain. In this case, the data field should contain the smart function you wish to execute, alongside any parameters.

8. Executați codul folosind node sendTx.js

Navigate back to your terminal or command line and run:

1node sendTx.js

9.Vedeți-vă tranzacția în Mempool

Open up the Mempool page(opens in a new tab) in your Alchemy dashboard and filter by the app you created to find your transaction. Aici este locul unde putem urmări tranziția tranzacției noastre de la starea de așteptare la starea minată (dacă are succes) sau la starea abandonată dacă nu are succes. Aveţi griijă să activaţi opțiunea „All” (Toate), ca să captați tranzacțiile „minate”, „în așteptare” și „abandonate”. Puteți de asemenea să vă căutați tranzacția uitându-vă după tranzacțiile trimise la adresa 0x31b98d14007bdee637298086988a0bbd31184523.

Pentru a vă vedea detaliile tranzacției odată ce aţi găsit-o, selectați „hash-ul tx”, ceea ce ar trebui să vă conducă să vizualizaţi ceva de genul:

Mempool watcher screenshot

Din acest punct, vă puteţi vizualiza tranzacția pe Etherscan făcând clic pe pictograma încercuită cu roșu!

Yippieeee! Tocmai ați trimis prima dvs. tranzacție Ethereum folosind Alchemy 🎉

For feedback and suggestions about this guide, please message Elan on Alchemy’s Discord(opens in a new tab)!

Originally published at https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy(opens in a new tab)

Ultima modificare: @nicklcanada(opens in a new tab), 15 august 2023

A fost util acest tutorial?