Ugrás a fő tartalomra
Change page

Tranzakciók

Utolsó módosítás: @Satglow(opens in a new tab), 2024. július 16.

A tranzakciók számlákból származó kriptográfiailag aláírt instrukciók. Egy számla tranzakciót indíthat, hogy frissítse az Ethereum hálózat állapotát. A legegyszerűbb tranzakció az ETH átutalása egyik számláról a másikra.

Előfeltételek

Ennek az oldalnak a jobb megértése érdekében javasoljuk, hogy először a Számlák és a bevezetés az Ethereumba című cikkeinket olvassa el.

Mi az a tranzakció?

Az Ethereum-tranzakció egy külső tulajdonú számla által kezdeményezett tevékenységre utal, más szóval egy számla, amelyet egy ember, nem pedig egy szerződés kezel. Például, ha Bob elküld Alice-nek 1 ETH-t, akkor Bob számláját terhelni kell, Alice számlájára pedig jóvá kell írni az összeget. Ez az állapotot megváltoztató művelet egy tranzakción belül történik.

Diagram, amely egy állapotot módosító tranzakciót ábrázol Diagram átvéve az Ethereum EVM illusztrálva(opens in a new tab) anyagból

Az EVM állapotát megváltoztató tranzakciókat a teljes hálózat számára közvetíteni kell. Bármely csomópont kérvényezheti egy tranzakció végrehajtását az EVM-en; miután ez megtörténik, egy validátor végrehajtja a tranzakciót és továbbterjeszti az eredményül kapott állapotot a hálózat többi része számára.

A tranzakciókért fizetni kell, és be kell kerüljenek egy validált blokkba. Hogy egyszerűbb legyen ez az áttekintés, a gázdíjak és a validáció témaköröket máshol taglaljuk.

Az elküldött tranzakció a következő információkat tartalmazza:

  • from – a küldő címe, aki aláírja a tranzakciót. Ez egy külső tulajdonú számla, mivel a szerződéses számlák nem küldenek tranzakciót.
  • to – a fogadó címe (ha egy külső tulajdonú számla, akkor a tranzakció értéket továbbít. Ha egy szerződéses számla, akkor a tranzakció szerződéskódot fog végrehajtani)
  • signature – a küldő azonosítója. Ez akkor jön létre, amikor a feladó privát kulcsa aláírja a tranzakciót, és megerősíti, hogy a küldő engedélyezte ezt a tranzakciót
  • nonce – egy növekvő számláló, amely a számláról küldött tranzakciók számát mutatja
  • value – az átküldendő ETH mennyisége a küldőtől a címzettnek (WEI-ben, ahol 1 ETH 1e+18 wei-nek felel meg)
  • input data – opcionális mező tetszőleges adatok megadására
  • gasLimit – a maximális gáz mennyisége, amelyet a tranzakció elfogyaszthat. Az EVM határozza meg a számítási lépésekhez szükséges gázmennyiségét
  • maxPriorityFeePerGas – az elfogyasztott gáz maximális ára, amely a validátor által kapott borravaló részét képezi
  • maxFeePerGas – a gázegységért fizethető maximális díj, amit a tranzakcióért kifizetnek (beleértve a baseFeePerGas és a maxPriorityFeePerGas értékét is)

A gáz a tranzakció feldolgozásához szükséges számításért jár, amelyet a validátor feldolgoz. A felhasználóknak díjat kell fizetniük ezért a számításért. A gasLimit és a maxPriorityFeePerGas meghatározza a validátornak fizetett maximális tranzakciós illetéket. Bővebben a gázról.

A tranzakcióobjektum nagyjából így néz ki:

1{
2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
4 gasLimit: "21000",
5 maxFeePerGas: "300",
6 maxPriorityFeePerGas: "10",
7 nonce: "0",
8 value: "10000000000"
9}
Összes megjelenítése
Másolás

De a tranzakcióobjektumot alá kell írni a küldő privát kulcsával. Ez bizonyítja, hogy a tranzakció kizárólag a küldőtől jöhetett, és nem történt csalás.

Egy Ethereum-kliens, mint a Geth, fogja kezelni az aláírási folyamatot.

Példa egy JSON-RPC-hívásra:

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}
Összes megjelenítése
Másolás

Példa válasz:

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}
Összes megjelenítése
Másolás
  • a raw az aláírt tranzakció a Recursive Length Prefix (RLP) által kódolt formában
  • a tx az aláírt tranzakció JSON-ban

Az aláírás hash-sel a tranzakcióról kriptográfiailag be lehet bizonyítani, hogy a küldőtől jött és így továbbították a hálózatra.

Az adatmező

A tranzakciók többsége egy szerződést ér el egy külső tulajdonú számláról. A legtöbb szerződést Solidity nyelven írják, az adatmezőt az alapján lehet értelmezni.

Az első négy bájt adja meg a funkciót a híváshoz, a funkció nevének és argumentumok hash-ét használva. A funkció néha beazonosítható ebből az adatbázisból(opens in a new tab).

A hívási adat többi része az argumentumok, az ABI-specifikáció szerint kódolva(opens in a new tab).

Nézzük meg ezt a tranzakciót(opens in a new tab). Kattintson a részletekért a hívási adatok megtekintéséért.

A funkcióválasztó a 0xa9059cbb. Számos ismert funkció létezik ezzel az aláírással(opens in a new tab). Ebben az esetben a szerződés forráskódját(opens in a new tab) feltöltöttük az Etherscan-be, így tudjuk, hogy a funkció a transfer(address,uint256).

Az adat többi része:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4

Az ABI specifikáció szerint az integer értékek (mint a címek, amelyek 20 bájt hosszú integerek) az ABI-ban 32 bájt hosszan jelennek meg, nullákkal az elején. Így tudjuk, hogy a to (fogadó) cím a 4f6742badb049791cd9a37ea913f2bac38d01279(opens in a new tab). Az value (érték) pedig 0x3b0559f4 = 990206452.

Tranzakciótípusok

Az Ethereumon található néhány tranzakciótípus:

  • Általános tranzakciók: egyik számláról a másikra.
  • Szerződést telepítő tranzakciók: ahol nincs „to” vagyis fogadó cím, és az adatmezőket a szerződéskódra használják.
  • A szerződés végrehajtása: olyan tranzakció, amely egy telepített okosszerződéssel kapcsolódik. Ekkor a „to” vagyis fogadó cím az okosszerződés címe.

A gázról

Ahogy korábban említettük, a tranzakciók gázköltséget igényelnek a lefutáshoz. Egy egyszerű átutalás 21 000 gázegységet igényel.

Bob 1 ETH-t küld Alice-nek, ahol a baseFeePerGas 190 gwei és a maxPriorityFeePerGas 10 gwei, így Bobnak a következő díjat kell kifizetnie:

1(190 + 10) * 21 000 = 4 200 000 gwei
2--vagyis--
30,0042 ETH

Bob számlája -1,0042 ETH-val csökken (1 ETH Alice-nek + 0,0042 ETH gázdíjakra)

Alice számlájára +1,0 ETH érkezik

Az elégetendő alapdíj -0,00399 ETH

A validátor megtartja a borravalót, ami +0,000210 ETH

Egy diagram, amely a fel nem használt gáz visszatérítését ábrázolja Diagram átvéve az Ethereum EVM illusztrálva(opens in a new tab) anyagból

A tranzakcióban fel nem használt összes gáz visszakerül a felhasználó számlájára.

Okosszerződéses interakciók

Minden olyan tranzakció gázt igényel, mely okosszerződéssel függ össze.

Az okosszerződések olyan funkciókat is tartalmazhatnak, mint a view(opens in a new tab) vagy pure(opens in a new tab), melyek nem változtatnak a szerződés állapotán. Emiatt ezen függvények meghívása egy külső tulajdonú számláról (EOA) nem igényel gázt. Az ennek megfelelő RPC meghívás az eth_call

Kivéve, ha az eth_call révén használják ezeket, a view vagy pure függvényeket általában belülről hívják meg (vagyis magából a szerződésből vagy másik szerződésből), ami gázba kerül.

Tranzakció-életciklus

Amikor valaki elküld egy tranzakciót, a következő történik:

  1. A tranzakciós hash kriptográfiailag generálódik: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. A tranzakció ezután elterjed a hálózaton, bekerül a tranzakció gyűjtőmedencébe, ami az összes függő tranzakciót tartalmazza.
  3. A validátornak ki kell választania a tranzakciót és bele kell foglalnia egy blokkba, hogy hitelesítse és „sikeresnek” minősítse.
  4. Az idő múlásával a tranzakciót tartalmazó adott blokk a hitelesítettből a véglegesített állapotba jut. Ezek a frissítések biztossá teszik, hogy a tranzakció sikeres és többé nem lehet megváltoztatni. Amint a blokk végleges lesz, csak egy hálózatszintű támadás tudja megváltoztatni, ami sok milliárd dollárba kerülne a támadó részéről.

Vizuális bemutató

Kövesse végig, ahogy Austin bemutatja a tranzakciókat, a gázt és a bányászatot.

Beírt tranzakciógöngyöleg

Az Ethereum eredetileg egyetlen formátummal rendelkezett a tranzakciókat illetően. Minden tranzakcióban a következő értékek voltak jelen: nonce, gázdíj, gázkorlátozás, a fogadó címe, az érték, adatok, v, r és s. Ezek a mezők RLP-kódolásúak, hogy így nézzenek ki:

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

Az Ethereum tovább fejlődött, hogy többféle tranzakciót is támogatni tudjon olyan funkciók lehetővé tételéhez, mint a hozzáférési listák és a EIP-1559(opens in a new tab), és úgy tudja ezeket bevezetni, hogy ne érintsék az eredeti tranzakció formátumát.

Az EIP-2718(opens in a new tab) teszi ezt lehetővé. A tranzakciókat így interpretálják:

TransactionType || TransactionPayload

Ahol a mezők jelentése:

  • TransactionType – egy szám 0 és 0x7f között, összesen 128 lehetséges tranzakciótípusra.
  • TransactionPayload – tetszőleges bájtsor, amelyet a tranzakció típusa határoz meg.

A TransactionType értéke alapján a tranzakció a következő kategórába eshet

  1. 0-s típusú (eredeti) tranzakciók: Az eredeti tranzakciós formátum az Ethereum bevezetése óta. Nem tartalmaznak az EIP-1559(opens in a new tab) által bevezetett jellemzőket, mint a dinamikus gázdíj-kalkuláció vagy elérhetőségi listák az okosszerződéseknek. Ezek az eredeti tranzakciók nem tartalmaznak olyan specifikus előtagot, amely jelezné a típusukat a sorosított formájukban, a 0xf8 bájttal kezdődnek, amikor Rekurzív hosszúságú prefix (RLP) kódolást használnak. A TransactionType értéke ekkor 0x0.

  2. 1-es típusú tranzakciók: Az EIP-2930(opens in a new tab) vezette be ezeket az Ethereum Berlin frissítése során, és ezek egy accessList (elérési lista) paramétert tartalmaznak. Ez a lista meghatározza azokat a címeket és tárolási kulcsokat, melyeket a tranzakció várhatóan elér, hogy így csökkentse a gázköltségét az összetett tranzakcióknak, melyek okosszerződésekből erednek. Az EIP-1559 díjpiaci változások nem részei az 1-es típusú tranzakcióknak. Ezek magukba foglalnak egy yParity paramétert, amely lehet 0x0 vagy 0x1, amely a secp256k1 aláírás y értékének megfelelését jelöli. Ezek a 0x01bájttal kezdődnek, és a TransactionType értéke 0x1.

  3. 2-es típusú tranzakciók, általában EIP-1559-tranzakciók, melyeket az EIP-1559(opens in a new tab) vezetett be az Ethereum London frissítésekor. Ezek lettek az Ethereum-hálózat sztenderd tranzakciótípusai. Egy új díjpiaci mechanizmust vezettek be, amely javítja az előrejelezhetőséget azáltal, hogy egy alapdíjra és egy prioritási díjra osztja fel a tranzakciós díjat. A 0x02 bájttal kezdődnek és olyan mezőket tartalmaznak, mint a maxPriorityFeePerGas és maxFeePerGas. Jelenleg a 2-es típusú tranzakciók az alapértelmezettek a rugalmasság és a hatékonyság okán, főleg a nagy hálózati leterheltség idején, mert a felhasználók jobban tudják kezelni a tranzakciós díjakat ezáltal. A TransactionType értéke ezekre 0x2.

További olvasnivaló

Ismersz olyan közösségi anyagot, mely segített neked? Módosítsd az oldalt és add hozzá!

  • Számlák
  • Ethereum virtuális gép (EVM)
  • Üzemanyag

Hasznosnak találta a cikket?