Przejdź do głównej treści
Change page

Maszyna wirtualna Ethereum (EVM)

Maszyna wirtualna Ethereum (EVM) to zdecentralizowane środowisko wirtualne, które wykonuje kod w sposób spójny i bezpieczny we wszystkich węzłach sieci Ethereum. Węzły uruchamiają EVM w celu wykonywania inteligentnych kontraktów, używając „gazu” do pomiaru wysiłku obliczeniowego wymaganego do operacji, co zapewnia wydajną alokację zasobów i bezpieczeństwo sieci.

Wymagania wstępne

Do zrozumienia EVM niezbędna jest podstawowa znajomość powszechnej terminologii informatycznej, takiej jak bajty (opens in a new tab), pamięć (opens in a new tab) i stos (opens in a new tab). Pomocne będzie również zaznajomienie się z pojęciami z zakresu kryptografii i technologii blockchain, takimi jak funkcje hashujące (opens in a new tab) oraz drzewo Merklego (opens in a new tab).

Od księgi rachunkowej do maszyny stanów

Analogia „rozproszonej księgi rachunkowej” jest często używana do opisu blockchainów takich jak Bitcoin, które umożliwiają istnienie zdecentralizowanej waluty przy użyciu podstawowych narzędzi kryptografii. Księga ta utrzymuje rejestr aktywności, który musi przestrzegać zestawu reguł określających, co można, a czego nie można zrobić, aby ją zmodyfikować. Na przykład adres Bitcoin nie może wydać więcej Bitcoinów, niż wcześniej otrzymał. Te zasady stanowią podstawę wszystkich transakcji w sieci Bitcoin i wielu innych blockchainach.

Chociaż Ethereum ma własną natywną kryptowalutę (ether), która podlega niemal dokładnie tym samym intuicyjnym zasadom, umożliwia również znacznie potężniejszą funkcję: inteligentne kontrakty. Dla tej bardziej złożonej funkcji wymagana jest bardziej wyrafinowana analogia. Zamiast rozproszonej księgi rachunkowej, Ethereum jest rozproszoną maszyną stanów (opens in a new tab). Stan Ethereum to duża struktura danych, która przechowuje nie tylko wszystkie konta i salda, ale także stan maszyny, który może zmieniać się z bloku na blok zgodnie z wcześniej zdefiniowanym zestawem reguł i który może wykonywać dowolny kod maszynowy. Konkretne zasady zmiany stanu z bloku na blok są definiowane przez EVM.

A diagram showing the make up of the EVM Schemat na podstawie Ethereum EVM illustrated (opens in a new tab)

Funkcja przejścia stanu Ethereum

EVM zachowuje się jak funkcja matematyczna: biorąc dane wejściowe, generuje deterministyczne dane wyjściowe. Dlatego bardzo pomocne jest bardziej formalne opisanie Ethereum jako posiadającego funkcję przejścia stanu:

Y(S, T)= S'

Biorąc stary, prawidłowy stan (S) i nowy zestaw prawidłowych transakcji (T), funkcja przejścia stanu Ethereum Y(S, T) generuje nowy, prawidłowy stan wyjściowy S'

Stan

W kontekście Ethereum stan to ogromna struktura danych zwana zmodyfikowanym drzewem Merkle Patricia, która przechowuje wszystkie konta połączone za pomocą hashów i sprowadzalne do pojedynczego hasha głównego przechowywanego w blockchainie.

Transakcje

Transakcje to podpisane kryptograficznie instrukcje pochodzące z kont. Istnieją dwa rodzaje transakcji: te, które skutkują wywołaniem wiadomości, oraz te, które skutkują utworzeniem kontraktu.

Utworzenie kontraktu skutkuje powstaniem nowego konta kontraktu zawierającego skompilowany kod bajtowy inteligentnego kontraktu. Za każdym razem, gdy inne konto wykonuje wywołanie wiadomości do tego kontraktu, wykonuje on swój kod bajtowy.

Instrukcje EVM

EVM działa jako maszyna stosowa (opens in a new tab) o głębokości 1024 elementów. Każdy element to 256-bitowe słowo, co zostało wybrane ze względu na łatwość użycia z 256-bitową kryptografią (taką jak hashe Keccak-256 lub podpisy secp256k1).

Podczas wykonywania EVM utrzymuje ulotną pamięć (jako tablicę bajtów adresowaną słowami), która nie jest zachowywana pomiędzy transakcjami.

Pamięć ulotna

Pamięć ulotna to magazyn klucz-wartość dla pojedynczej transakcji, do którego dostęp uzyskuje się za pomocą kodów operacji TSTORE i TLOAD. Utrzymuje się ona we wszystkich wewnętrznych wywołaniach podczas tej samej transakcji, ale jest czyszczona na jej końcu. W przeciwieństwie do pamięci, pamięć ulotna jest modelowana jako część stanu EVM, a nie ramki wykonawczej, jednak nie jest zatwierdzana do stanu globalnego. Pamięć ulotna umożliwia oszczędne pod względem gazu współdzielenie tymczasowego stanu pomiędzy wewnętrznymi wywołaniami podczas transakcji.

Pamięć (Storage)

Kontrakty zawierają drzewo trie pamięci Merkle Patricia (jako adresowalną słowami tablicę słów), powiązane z danym kontem i będące częścią stanu globalnego. Ta trwała pamięć różni się od pamięci ulotnej, która jest dostępna tylko przez czas trwania pojedynczej transakcji i nie stanowi części trwałego drzewa trie pamięci konta.

Kody operacji

Skompilowany kod bajtowy inteligentnego kontraktu jest wykonywany jako szereg kodów operacji EVM, które wykonują standardowe operacje na stosie, takie jak XOR, AND, ADD, SUB itp. EVM implementuje również szereg operacji na stosie specyficznych dla blockchaina, takich jak ADDRESS, BALANCE, BLOCKHASH itp. Zestaw kodów operacji obejmuje również TSTORE i TLOAD, które zapewniają dostęp do pamięci ulotnej.

A diagram showing where gas is needed for EVM operations Schematy na podstawie Ethereum EVM illustrated (opens in a new tab)

Implementacje EVM

Wszystkie implementacje EVM muszą być zgodne ze specyfikacją opisaną w żółtej księdze Ethereum.

W ciągu dziesięcioletniej historii Ethereum, EVM przeszła kilka rewizji i istnieje kilka jej implementacji w różnych językach programowania.

Klienty warstwy wykonawczej Ethereum zawierają implementację EVM. Ponadto istnieje wiele samodzielnych implementacji, w tym:

Dalsza lektura

Samouczki: Maszyna wirtualna Ethereum (EVM) / Kody operacji w Ethereum