Přeskočit na hlavní obsah
Change page

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 ukazující, jak transakce způsobí změnu stavu 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 a maxPriorityFeePerGas).

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še
Kopí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še
Kopí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še
Kopí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:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4

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 gwei
2--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.

Diagram ukazující vrácení nepoužitého paliva 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:

  1. Kryptograficky je vygenerován hash transakce: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017.
  2. 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.
  3. 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“.
  4. 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

  1. 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 je 0x0.

  2. 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í parametr yParity, který může být buď 0x0 nebo 0x1, což označuje paritu hodnoty y v podpisu secp256k1. Tyto transakce jsou identifikovány začátkem bajtu 0x01 a jejich hodnota TransactionType je 0x1.

  3. 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 je maxPriorityFeePerGas a maxFeePerGas. 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 je 0x2.

Další informace

Víte o komunitním zdroji, který vám pomohl? Upravte tuto stránku a přidejte ho!

  • Účty
  • Virtuální stroj Ethereum (EVM)
  • Palivo

Byl tento článek užitečný?