Salt la conținutul principal
Change page

Tranzacții

Ultima modificare: , 15 august 2023

Tranzacțiile sunt instrucțiuni semnate criptografic din conturi. Un cont inițiază o tranzacție pentru a actualiza starea rețelei Ethereum. Cea mai simplă tranzacție este transferarea de ETH dintr-un cont în altul.

Condiții prealabile

Pentru a vă ajuta să înțelegeți mai bine această pagină, vă recomandăm să citiți mai întâi Conturi și introducere despre Ethereum.

Ce este o tranzacție?

O tranzacție Ethereum se referă la o acțiune inițiată de un cont deținut din exterior, cu alte cuvinte un cont gestionat de o persoană, nu de un contract. De exemplu, dacă Bob trimite lui Alice 1 ETH, contul lui Bob trebuie debitat, iar cel al lui Alice trebuie creditat. Această acțiune care schimbă starea are loc în cadrul unei tranzacții.

Diagramă care arată o tranzacție ce provoacă modificarea stării Diagramă adaptată din Ethereum EVM ilustrat(opens in a new tab)

Tranzacțiile, care schimbă starea EVM, trebuie difuzate către întreaga rețea. Orice nod poate difuza cererea ca o tranzacție să fie executată pe EVM; după aceasta, un miner va executa tranzacția și va propaga modificarea stării ce rezultă către restul rețelei.

Tranzacțiile trebuie să fie taxate și trebuie minate pentru a deveni valide. Pentru a simplifica această prezentare generală, vom trata despre taxele pe gaz și exploatare în altă parte.

O tranzacție trimisă cuprinde următoarele informații:

  • destinatarul – adresa de primire (dacă este un cont deținut extern, tranzacția va transfera valoare. Dacă este un cont de contract, tranzacția va executa codul contractului)
  • semnătura – identificatorul expeditorului. Aceasta se generează atunci când cheia privată a expeditorului semnează tranzacția și confirmă că expeditorul a autorizat această tranzacție
  • valoarea – cantitatea de ETH de transferat de la expeditor la destinatar (în WEI, o denominație a ETH-ului)
  • date – câmp opțional pentru a include date arbitrare
  • gasLimit – cantitatea maximă de unități de gaz care pot fi consumate de tranzacție. Unitățile de gaz reprezintă etape de calcul
  • maxPriorityFeePerGas - cantitatea maximă de gaz care va fi inclusă ca bacșiș pentru miner
  • maxFeePerGas - suma maximă de gaz care se convine să fie plătită pentru tranzacție (inclusiv baseFeePerGas și maxPriorityFeePerGas)

Gazul se referă la calculul necesar procesării tranzacției de către un miner. Utilizatorii trebuie să plătească o taxă pentru acest calcul. gasLimit, și maxPriorityFeePerGas determină taxa maximă de tranzacție plătită miner-ului. Mai multe despre gaz.

Obiectul tranzacției va arăta astfel:

1{
2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
4 gasLimit: "21000",
5 maxFeePerGas: "300",
6 maxPriorityFeePerGas: "10",
7 nonce: "0",
8 value: "10000000000"
9}
Afișează tot
Copiați

Dar un obiect de tranzacție trebuie să fie semnat folosind cheia privată a expeditorului. Acest lucru demonstrează că tranzacția ar fi putut proveni doar de la expeditor și nu a fost trimisă în mod fraudulos.

Un client Ethereum precum Geth se va ocupa de acest proces de semnare.

Exemplu de apel JSON-RPC(opens in a new tab):

1{
2 "id": 2,
3 "jsonrpc": "2.0",
4 "method": "account_signTransaction",
5 "params": [
6 {
7 "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
8 "gas": "0x55555",
9 "maxFeePerGas": "0x1234",
10 "maxPriorityFeePerGas": "0x1234",
11 "input": "0xabcd",
12 "nonce": "0x0",
13 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
14 "value": "0x1234"
15 }
16 ]
17}
Afișează tot
Copiați

Exemplu de răspuns:

1{
2 "jsonrpc": "2.0",
3 "id": 2,
4 "result": {
5 "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
6 "tx": {
7 "nonce": "0x0",
8 "maxFeePerGas": "0x1234",
9 "maxPriorityFeePerGas": "0x1234",
10 "gas": "0x55555",
11 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
12 "value": "0x1234",
13 "input": "0xabcd",
14 "v": "0x26",
15 "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",
16 "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
17 "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"
18 }
19 }
20}
Afișează tot
Copiați
  • raw este tranzacția semnată în formă codificată cu Prefix de lungime recursivă (RLP)
  • tx este tranzacția semnată în formă JSON

Cu hash-ul semnăturii, se poate dovedi criptografic că tranzacția a venit de la expeditor și a fost trimisă rețelei.

The data field

The vast majority of transactions access a contract from an externally-owned account. Most contracts are written in Solidity and interpret their data field in accordance with the .

The first four bytes specify which function to call, using the hash of the function's name and arguments. You can sometimes identify the function from the selector using this database(opens in a new tab).

The rest of the calldata is the arguments, encoded as specified in the ABI specs(opens in a new tab).

For example, lets look at this transaction(opens in a new tab). Use Click to see More to see the calldata.

The function selector is 0xa9059cbb. There are several known functions with this signature(opens in a new tab). In this case the contract source code(opens in a new tab) has been uploaded to Etherscan, so we know the function is transfer(address,uint256).

The rest of the data is:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4

According to the ABI specifications, integer values (such as addresses, which are 20-byte integers) appear in the ABI as 32-byte words, padded with zeros in the front. So we know that the to address is 4f6742badb049791cd9a37ea913f2bac38d01279(opens in a new tab). The value is 0x3b0559f4 = 990206452.

Tipuri de tranzacții

Pe Ethereum există câteva tipuri diferite de tranzacții:

  • Tranzacțiile obișnuite: o tranzacție de la un portofel la altul.
  • Tranzacții de implementare a contractelor: o tranzacție fără o adresă „la”, în cazul în care câmpul de date este utilizat pentru codul contractului.
  • Execution of a contract: a transaction that interacts with a deployed smart contract. In this case, 'to' address is the smart contract address.

On gas

După cum s-a menționat, tranzacțiile costă gaz pentru a fi executate. Tranzacțiile de transfer simple necesită 21.000 de unități de Gaz.

Astfel, pentru ca Bob să îi trimită lui Alice 1 ETH la un baseFeePerGas de 190 gwei și maxPriorityFeePerGas de 10 gwei, Bob va trebui să plătească următoarea taxă:

1(190 + 10) * 21000 = 4,200,000 gwei
2--or--
30.0042 ETH

Contul lui Bob va fi debitat -1.0042 ETH

Contul lui Alice va fi creditat cu +1.0 ETH

Taxa de bază va fi arsă -0.00399 ETH

Minerul păstrează bacșișul +0.000210 ETH

Gazul este necesar și pentru orice interacțiune cu contractul inteligent.

Diagrama care arată modul în care este rambursat gazul neutilizat Diagramă adaptată din Ethereum EVM ilustrat(opens in a new tab)

Orice gaz neutilizat într-o tranzacție este rambursat în contul utilizatorului.

Ciclul de viață al tranzacției

Odată ce tranzacția a fost trimisă, se întâmplă următoarele:

  1. Odată ce trimiteți o tranzacție, criptografia generează un hash de tranzacție: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. Tranzacția este apoi transmisă în rețea și inclusă într-un grup cu ​​multe alte tranzacții.
  3. Un miner trebuie să vă aleagă tranzacția și să o includă într-un bloc pentru a o verifica și a o considera „reușită”.
    • Este posibil să așteptați în această etapă, dacă rețeaua este ocupată și miner-ii nu sunt în măsură să țină pasul.
  4. Tranzacția dvs. va primi „confirmări”. Numărul de confirmări reprezintă numărul de blocuri create de la blocul care a inclus tranzacția dumneavoastră. Cu cât acest număr este mai mare, cu atât mai mare este certitudinea că rețeaua a procesat și a recunoscut tranzacția.
    • Blocurile recente pot fi reorganizate, lăsând impresia că tranzacția nu a avut succes; cu toate acestea, tranzacția poate fi încă validă, dar inclusă într-un alt bloc.
    • Probabilitatea unei reorganizări scade cu fiecare bloc minat ulterior, în sensul că, pe măsură ce numărul de confirmări este mai mare, tranzacția este cu atât mai imuabilă.

O demonstrație vizuală

Urmăriți-l pe Austin cum vă prezintă tranzacțiile, gazele și mineritul.

Tranzacția plic tipizată

Ethereum avea inițial un singur format pentru tranzacții. Fiecare tranzacție conținea un nonce, gas price, gas limit, to address, value, data, v, r, și s. Aceste câmpuri sunt codificate RLP, ca să arate cam așa:

RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])

Ethereum a evoluat pentru a suporta mai multe tipuri de tranzacții care permită implementarea de noi caracteristici, cum ar fi listele de acces și EIP-1559(opens in a new tab), fără ca acestea să afecteze formatele tradiționale de tranzacții.

EIP-2718: Tranzacția plic tipizată (Typed Transaction Envelope)(opens in a new tab) definește un tip de tranzacție care este un plic pentru viitoarele tipuri de tranzacții.

EIP-2718 este un nou plic generalizat pentru tranzacții tipizate. În noul standard, tranzacțiile sunt interpretate ca:

TransactionType || TransactionPayload

Unde câmpurile sunt definite astfel:

  • TransactionType - un număr între 0 și 0x7f, pentru un total de 128 de tipuri de tranzacții posibile.
  • TransactionPayload - o matrice arbitrară de octeți definită de tipul de tranzacție.

Referințe suplimentare

Cunoașteți o resursă a comunității care v-a ajutat? Editaţi această pagină și adăugaţi-o!

A fost util acest articol?