Virtuální stroj Etherea (EVM)
Poslední úpravy: @headwitch(opens in a new tab), 21. června 2024
Virtuální stroj Etherea (EVM) je decentralizované virtuální prostředí, které konzistentně a bezpečně vykonává kód na všech uzlech Etherea. Uzly spouštějí EVM, aby vykonávaly chytré kontrakty, přičemž používají "jednotky" k měření výpočetního úsilí potřebného pro tyto operace, což zajišťuje efektivní alokaci zdrojů a bezpečnost sítě.
Předpoklady
Pro pochopení EVM je nutné mít základní povědomí o běžné terminologii v informatice, jako jsou bajty(opens in a new tab), paměť(opens in a new tab) a zásobník(opens in a new tab). Také se hodí mít znalosti z oblasti kryptografie a blockchainu, např. o hashovacích funkcích(opens in a new tab) a Merkle tree(opens in a new tab).
Od účetní knihy ke stavovému stroji
Přirovnání k „distribuované účetní knize“ se často používá k popisu blockchainů, jako je Bitcoin, které mají decentralizovanou měnu s využitím základních nástrojů kryptografie. Účetní kniha udržuje záznam aktivit za současného dodržování souboru pravidel, která určují, co může a nemůže uživatel dělat při úpravě této knihy. Např. bitcoinová adresa nemůže utratit více Bitcoinů, než kolik jich předtím obdržela. Tato pravidla jsou základem všech transakcí na Bitcoinu a mnoha dalších blockchainech.
Ethereum má svou vlastní nativní kryptoměnu (Ether), která se řídí téměř stejnými intuitivními pravidly, ale také umožňuje mnohem silnější funkci: chytré kontrakty. Pro tuto složitější funkci potřebujeme sofistikovanější přirovnání. Namísto distribuované účetní knihy je Ethereum distribuovaný stavový stroj(opens in a new tab). Stav Etherea je velká datová struktura, která obsahuje nejen všechny účty a zůstatky, ale také stav stroje, který se může měnit od bloku k bloku podle předem definovaného souboru pravidel a který může vykonávat libovolný strojový kód. Specifická pravidla pro změnu stavu od bloku k bloku jsou definována v EVM.
Schéma převzato z ilustrace Ethereum EVM(opens in a new tab)
Funkce změny stavu na Ethereu
EVM se chová jako matematická funkce: Na základě vstupu produkuje deterministický výstup. Je tedy užitečné formálněji popsat Ethereum jako systém s funkcí změny stavu:
1Y(S, T)= S'
Na základě starého platného stavu (S)
a nové sady platných transakcí (T)
funkce změny stavu Etherea Y(S, T)
vytvoří nový platný výstupní stav S'
.
Stav
V kontextu Etherea je stav obrovská datová struktura nazývaná modifikovaný Merkle Patricia Trie, která udržuje všechny účty propojené pomocí hashů a redukovatelné na jediný kořenový hash uložený na blockchainu.
Transakce
Transakce jsou kryptograficky podepsané instrukce poslané z účtů. Existují dva typy transakcí: Ty, jejich výsledkem je volání zpráv (message calls), a ty, které vedou k vytvoření kontraktu.
Vytvoření kontraktu vede k vytvoření nového kontraktového účtu, který obsahuje zkompilovaný bytecode chytrého kontraktu. Kdykoli jiný účet vyšle zprávu na tento kontrakt, vykoná se jeho bytecode.
Instrukce EVM
EVM funguje jako zásobníkový stroj(opens in a new tab) s hloubkou 1 024 položek. Každá položka je 256bitové slovo, které bylo zvoleno pro snadné použití s 256bitovou kryptografií (např. hashe Keccak-256 nebo podpisy secp256k1).
Během vykonávání EVM udržuje přechodnou paměť (jako bajtové pole adresované slovy), která nepřetrvává mezi transakcemi.
Kontrakty však obsahují trie úložiště Merkle Patricia (jako pole adresovatelné slovy), které je spojeno s příslušným účtem a je součástí globálního stavu.
Zkompilovaný bytecode chytrého kontraktu se vykonává jako řada opkódů EVM, které provádějí standardní zásobníkové operace jako XOR
, AND
, ADD
, SUB
atd. EVM také implementuje několik blockchainově specifických zásobníkových operací, jako je ADDRESS
, BALANCE
, BLOCKHASH
atd.
Diagram převzat z ilustrovaného Ethereum EVM(opens in a new tab)
Implementace EVM
Všechny implementace EVM musí dodržovat specifikaci popsanou v Ethereum Yellowpaperu.
Během devítileté historie Etherea prošlo EVM několika revizemi a existuje několik implementací EVM v různých programovacích jazycích.
Exekuční klienty Etherea obsahují implementaci EVM. Navíc existuje několik samostatných implementací, včetně:
- Py-EVM(opens in a new tab) – Python
- evmone(opens in a new tab) – C++
- ethereumjs-vm(opens in a new tab) – JavaScript
- revm(opens in a new tab) – Rust
Další informace
- Ethereum Yellowpaper(opens in a new tab)
- Jellopaper alias KEVM: Sémantika EVM v K(opens in a new tab)
- The Beigepaper(opens in a new tab)
- Opkódy Virtuálního stroje Etherea(opens in a new tab)
- Interaktivní reference pro opkódy Virtuálního stroje Etherea(opens in a new tab)
- Krátký úvod v dokumentaci Solidity(opens in a new tab)
- Kniha Mastering Ethereum – Virtuální stroj Etherea(opens in a new tab)