Ugrás a fő tartalomra
Change page

Tranzakciók

Utolsó módosítás: , 2024. január 18.

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-et, 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.
  • recipient – 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

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

Az okosszerződéses interakciók is gázt igényelnek.

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.

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.

További olvasnivaló

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

Hasznosnak találta a cikket?