Transakce
Poslední úpravy: @headwitch(opens in a new tab), 16. července 2024
Transakce jsou kryptograficky podepsané instrukce poslané z účtů. Účet zahájí transakci, aby aktualizoval stav sítě Ethereum. Nejjednodušší transakcí je převod ETH z jednoho účtu na druhý.
Předpoklady
Abyste této stránce lépe porozuměli, doporučujeme vám si nejprve přečíst sekci Účty a náš úvod do Etherea.
Co je to transakce?
Transakce na Ethereu odkazuje na akci zahájenou externě vlastněným účtem, jinými slovy účtem spravovaným člověkem, nikoliv kontraktem. Např. pokud Bob pošle Alici 1 ETH, zůstatek na Bobově účtu musí být snížen a Alicin musí být navýšen. Tato akce mění stav sítě a probíhá v rámci transakce.
Diagram převzat z ilustrace Ethereum EVM(opens in a new tab)
Transakce, které mění stav EVM, musí být posílány do celé sítě. Jakýkoliv uzel může vyslat požadavek na provedení transakce na EVM. Poté validátor provede transakci a výslednou změnu stavu sdílí do zbytku sítě.
Transakce vyžadují poplatek a musí být zahrnuty do validovaného bloku. Abychom tento přehled zjednodušili, poplatkům za palivo a validaci se věnujeme jinde.
Odeslaná transakce obsahuje následující informace:
from
– adresa odesílatele, který transakci podepíše. Toto bude externě vlastněný účet, protože kontraktové účty nemohou odesílat transakce.to
– adresa příjemce. Pokud jde o externě vlastněný účet, transakce převede hodnotu. Pokud jde o kontraktový účet, transakce vykoná kód kontraktu.signature
– podpis, který je identifikátorem odesílatele. Tento identifikátor je vygenerován, když odesílatelův privátní klíč podepíše transakci a potvrdí, že odesílatel tuto transakci autorizoval.nonce
– postupně se zvyšující čítač, který označuje číslo transakce z účtu.value
– množství ETH, které má být převedeno od odesílatele k příjemci (denominováno ve WEI, kde 1 ETH odpovídá 1e+18 wei).input data
– volitelné pole pro přidání libovolných dat.gasLimit
– maximální množství jednotek paliva, které může být transakcí spotřebováno. EVM specifikuje jednotky paliva potřebné pro každý výpočetní krok.maxPriorityFeePerGas
– maximální cena spotřebovaného paliva, která bude zahrnuta jako spropitné pro validátora.maxFeePerGas
– maximální poplatek za jednotku paliva, který je uživatel ochoten zaplatit za transakci (včetněbaseFeePerGas
amaxPriorityFeePerGas
).
Palivo reprezentuje výpočetní výkon potřebný k provedení transakce validátorem. Uživatelé musí za tento výpočet zaplatit poplatek. gasLimit
a maxPriorityFeePerGas
určují maximální transakční poplatek zaplacený validátorovi. Další informace o palivu.
Objekt transakce bude vypadat zhruba takto:
1{2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",4 gasLimit: "21000",5 maxFeePerGas: "300",6 maxPriorityFeePerGas: "10",7 nonce: "0",8 value: "10000000000"9}Zobrazit všeKopírovat
Transakční objekt však musí být podepsán pomocí privátního klíče odesílatele. Tím se prokáže, že transakce mohla být odeslána pouze odesílatelem a nebyla odeslána podvodně.
Ethereum klient, jako je Geth, se o proces podepisování postará.
Příklad volání JSON-RPC:
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}Zobrazit všeKopírovat
Ukázková odpověď:
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}Zobrazit všeKopírovat
raw
je podepsaná transakce v kódovaném formátu Recursive Length Prefix (RLP).tx
je podepsaná transakce ve formátu JSON.
S hashem podpisu může být transakce kryptograficky ověřena jako pocházející od odesílatele a odeslána do sítě.
Datové pole
Většina transakcí putuje do kontraktu z externě vlastněného účtu. Většina kontraktů je napsána v jazyce Solidity a interpretuje své datové pole v souladu se specifikací .
První čtyři bajty specifikují, která funkce se má zavolat, pomocí hashe názvu funkce a jejích argumentů. Někdy můžete identifikovat funkci pomocí selektoru s využitím této databáze(opens in a new tab).
Zbytek calldat jsou argumenty, zakódované podle specifikace ABI(opens in a new tab).
Např. se podívejme na tuto transakci(opens in a new tab). K zobrazení calldat použijte možnost „Click to see More“.
Funkční selektor je 0xa9059cbb
. Existuje několik známých funkcí s tímto podpisem(opens in a new tab). V tomto případě byl zdrojový kód kontraktu(opens in a new tab) nahrán na Etherscan, takže víme, že funkce je transfer(address,uint256)
.
Zbytek dat je:
10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d012792000000000000000000000000000000000000000000000000000000003b0559f4
Podle specifikací ABI se celočíselné hodnoty (jako jsou adresy, což jsou 20bajtová celá čísla) zobrazují v ABI jako 32bajtová slova, doplněná nulami na začátku. Takže víme, že adresa to
je 4f6742badb049791cd9a37ea913f2bac38d01279
(opens in a new tab). value
je 0x3b0559f4 = 990206452.
Typy transakcí
Na Ethereu existuje několik různých typů transakcí:
- Běžné transakce: Převody z jednoho účtu na druhý.
- Transakce sloužící k nasazení kontraktu: Transakce bez adresy „to“, do datového pole se vkládá kód kontraktu.
- Exekuce kontraktu: Transakce, která interaguje s již nasazeným chytrým kontraktem. V tomto případě je adresa „to“ adresou chytrého kontraktu.
O palivu
Jak bylo zmíněno, vykonání transakce stojí palivo. Jednoduché převodní transakce vyžadují 21 000 jednotek paliva.
Takže pokud Bob chce poslat Alici 1 ETH s baseFeePerGas
190 gwei a maxPriorityFeePerGas
10 gwei, bude muset zaplatit následující poplatek:
1(190 + 10) * 21 000 = 4 200 000 gwei2--nebo--30,0042 ETH
Zůstatek Bobova účtu bude snížen o 1,0042 ETH (1 ETH pro Alici + 0,0042 ETH na poplatky za palivo).
Zůstatek na Alicině účtu bude navýšen o 1,0 ETH.
Základní poplatek 0,00399 ETH bude spálen.
Validátor si ponechá spropitné ve výši 0,000210 ETH.
Schéma převzato z ilustrace Ethereum EVM(opens in a new tab)
Jakékoliv palivo, které nebude v transakci použito, bude vráceno na účet odesílatele.
Interakce s chytrými kontrakty
Palivo je potřeba pro jakoukoliv transakci, která zahrnuje chytrý kontrakt.
Chytré kontrakty mohou také obsahovat funkce známé jako view
(opens in a new tab) nebo pure
(opens in a new tab), které nemění stav kontraktu. Volání těchto funkcí z externě vlastněného účtu tedy nevyžaduje žádné palivo. Základní volání RPC pro tento scénář je eth_call
.
Na rozdíl od volání pomocí eth_call
jsou tyto funkce view
nebo pure
často volány interně (tj. z kontraktu samotného nebo z jiného kontraktu), což stojí palivo.
Životní cyklus transakce
Jakmile je transakce odeslána, následuje tento proces:
- Kryptograficky je vygenerován hash transakce:
0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
. - Transakce je poté poslána do sítě a přidána do transakčního poolu obsahujícího všechny ostatní čekající transakce v síti.
- Validátor musí vaši transakci vybrat a zahrnout ji do bloku, aby bylo možné ji ověřit a považovat za „úspěšnou“.
- S postupem času bude blok obsahující vaši transakci označen jako „oprávněný“ a poté „finalizovaný“. Tato vylepšení znamenají mnohem větší jistotu, že vaše transakce byla úspěšná a nikdy nebude změněna. Jakmile je blok „finalizován“, mohl by být změněn pouze útokem na úrovni sítě, který by stál několik miliard dolarů.
Vizuální ukázka
Na tomto videu vás Austin provede transakcemi, palivem a těžbou.
Typizovaná transakční obálka
Ethereum původně mělo pro transakce jen jeden formát. Každá transakce obsahovala pole nonce, gas price, gas limit, adresu to, value, data, v, r a s. Tato pole jsou RLP-kódovaná a vypadají zhruba takto:
RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])
Ethereum se vyvinulo tak, aby podporovalo více typů transakcí a umožnilo implementaci nových funkcí, jako jsou seznamy přístupu a EIP-1559(opens in a new tab), aniž by to ovlivnilo starší formáty transakcí.
EIP-2718(opens in a new tab) toto chování umožňuje. Transakce jsou interpretovány takto:
TransactionType || TransactionPayload
Kde jsou pole definována jako:
TransactionType
– číslo mezi 0 a 0x7f, což umožňuje celkem 128 možných typů transakcí.TransactionPayload
– libovolné pole bajtů definované typem transakce.
Na základě hodnoty TransactionType
může být transakce klasifikována jako
Transakce typu 0 (Legacy): Původní formát transakce používaný od spuštění Etherea. Neobsahuje funkce z EIP-1559(opens in a new tab), jako je dynamický výpočet poplatků za palivo nebo seznamy přístupu pro chytré kontrakty. Legacy transakce nemají specifický prefix označující jejich typ ve svém serializovaném formátu, začínají bajtem
0xf8
při použití kódování Recursive Length Prefix (RLP). Hodnota TransactionType pro tyto transakce je0x0
.Transakce typu 1: Ty byly zavedeny v EIP-2930(opens in a new tab) jako součást vylepšení Berlín a zahrnují parametr
accessList
. Tento seznam specifikuje adresy a klíče úložiště, které by měla transakce kontaktovat, což může potenciálně snížit náklady na palivo pro složité transakce zahrnující chytré kontrakty. Změny v tržním mechanismu poplatků podle EIP-1559 nejsou v transakcích typu 1 zahrnuty. Transakce typu 1 také obsahují parametryParity
, který může být buď0x0
nebo0x1
, což označuje paritu hodnoty y v podpisu secp256k1. Tyto transakce jsou identifikovány začátkem bajtu0x01
a jejich hodnota TransactionType je0x1
.Transakce typu 2, běžně označovány jako transakce podle EIP-1559, byly zavedeny v EIP-1559(opens in a new tab) v rámci vylepšení Londýn. Staly se standardním typem transakcí na Ethereu. Tyto transakce zavádějí nový mechanismus trhu s poplatky, který zlepšuje předvídatelnost rozdělením poplatku za transakci na základní poplatek a prioritní poplatek. Začínají bajtem
0x02
a zahrnují pole, jako jemaxPriorityFeePerGas
amaxFeePerGas
. Transakce typu 2 jsou nyní výchozí díky své flexibilitě a efektivitě, zejména v obdobích vysokého zatížení sítě, protože uživatelům umožňují lépe plánovat poplatky za transakce. Hodnota TransactionType pro tyto transakce je0x2
.
Další informace
Víte o komunitním zdroji, který vám pomohl? Upravte tuto stránku a přidejte ho!