Tranzakciók
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 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.
A hívási adat többi része az argumentumok, az ABI-specifikáció szerint kódolva.
Nézzük meg ezt a tranzakciót. 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. Ebben az esetben a szerződés forráskódját 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
. 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 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
vagy pure
, 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, és úgy tudja ezeket bevezetni, hogy ne érintsék az eredeti tranzakció formátumát.
Az EIP-2718 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 á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 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 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á!