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 á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ótnonce
– egy növekvő számláló, amely a számláról küldött tranzakciók számát mutatjavalue
– 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áragasLimit
– 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étmaxPriorityFeePerGas
– az elfogyasztott gáz maximális ára, amely a validátor által kapott borravaló részét képezimaxFeePerGas
– a gázegységért fizethető maximális díj, amit a tranzakcióért kifizetnek (beleértve abaseFeePerGas
és amaxPriorityFeePerGas
é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éseMá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éseMá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éseMá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:
10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d012792000000000000000000000000000000000000000000000000000000003b0559f4
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 gwei2--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
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:
- A tranzakciós hash kriptográfiailag generálódik:
0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
- 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.
- A validátornak ki kell választania a tranzakciót és bele kell foglalnia egy blokkba, hogy hitelesítse és „sikeresnek” minősítse.
- 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
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 ekkor0x0
.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 egyyParity
paramétert, amely lehet0x0
vagy0x1
, amely a secp256k1 aláírás y értékének megfelelését jelöli. Ezek a0x01
bájttal kezdődnek, és a TransactionType értéke0x1
.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 amaxPriorityFeePerGas
ésmaxFeePerGas
. 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 ezekre0x2
.
További olvasnivaló
Ismersz olyan közösségi anyagot, mely segített neked? Módosítsd az oldalt és add hozzá!