Maszyna Wirtualna Ethereum (EVM)
Maszyna Wirtualna Ethereum (EVM) jest fizyczną instancją, która nie może być opisana w taki sam sposób, jak moglibyśmy wskazać na chmurę lub fale oceanu, ale istnieje jako pojedynczy byt utrzymywany przez miliony połączonych komputerów, na których działa klient Ethereum.
Protokół Ethereum istnieje wyłącznie w celu utrzymania niezakłóconej ciągłości i niezmienności operacji tej specjalnej maszyny stanów; jest to środowisko, w którym działają wszystkie konta oraz inteligentne kontrakty Ethereum. Każdy blok łańcucha Ethereum posiada jeden i tylko jeden stan „kanoniczny”, a EVM jest tym co definiuje zasady obliczeń nowego poprawnego stanu dla kolejnych bloków.
Wymagania wstępne
Do zrozumienia EVM konieczna jest znajomość podstawowej terminologii informatycznej, takiej jak bajty, pamięć i stos. Równie pomocne może się okazać zaznajomienie się z takimi pojęciami, jak kryptografia, blockchain funkcja haszująca, Proof-of-Work, drzewo Merkle.
Od księgi głównej do maszyny stanowej
Analogia „księgi głównej” jest często używana w celu opisania blockchainów np. takich jak Bitcoin, które umożliwiają zdecentralizowanym walutom używanie fundamentalnych narzędzi kryptograficznych. Kryptowaluta zachowuje się, jak „normalna“ waluta poprzez zasady jakimi jest zarządzana, co ktoś może, a czego nie może robić, aby zmodyfikować księgę główną. Dla przykładu, adres Bitcoina nie może wydać więcej Bitcoinów, niż wcześniej otrzymał. Zasady te są podstawą wszystkich transakcji na Bitcoinie i wielu innych blockchainach.
Choć Ethereum ma swoją własną kryptowalutę (Ether), która działa niemal dokładnie według tych samych intuicyjnych zasad, pozwala również stosować znacznie bardziej rozbudowaną funkcję: inteligentne kontrakty. Dla tej skomplikowanej funkcji wymagana jest bardziej wyszukana analogia. W odróżnieniu od rozproszonej księgi główne, Ethereum jest rozproszoną maszyną stanową. Stany Ethereum są wielkimi strukturami danych, które przechowują nie tylko wszystkie konta i ich salda, ale też stan maszyny, który może zmieniać się od bloku do bloku zgodnie z predefiniowanymi zasadami, i który może wykonywać dowolny kod maszynowy. Konkretne zasady zmiany stanu od bloku do bloku są zdefiniowane przez EVM.
Schemat zaadaptowany z Ethereum EVM illustrated
Funkcja przejścia stanów Ethereum
EVM zachowuje się jak funkcja matematyczna: biorąc pod uwagę dane wejściowe, wytwarza deterministyczne dane wyjściowe. Dlatego bardziej pomocne jest bardziej formalne opisanie Ethereum jako posiadającego funkcję zmiany stanu:
1Y(S, T)= S'2
Uwzględniając stary ważny stan (S)
oraz nowy zestaw ważnych transakcji (T)
, funkcja zmiany stanu Ethereum Y(S, T)
tworzy nowy prawidłowy stan wyjściowy S'
Stan
W odniesieniu do Ethereum, stan jest olbrzymią strukturą danych nazywaną zmodyfikowanym drzewem Merkle Patricia, która zachowuje wszystkie konta połączone haszami i zredukowane do pojedynczego haszu źródłowego przechowywanego na blockchainie.
Transakcje
Transakcje są to pojedyncze kryptograficznie podpisane instrukcję pochodzące z kont użytkowników. Możemy wyróżnić dwa typy transakcji: te, których wynikiem są wywołania komunikatów, oraz te, których wynikiem jest utworzenie kontraktu.
Rezultatem stworzenia nowego kontraktu jest stworzenie nowego konta kontaktu zawierającego skompilowany kod bitowy inteligentnego kontraktu. Ilekroć inne konto wysyła wywołania komunikatów do tego kontraktu, wykonuje on kod bitowy.
Instrukcje EVM
EVM działa jako maszyna stosu, która posiada 1024 elementy. Każdy element jest 256-bitowym słowem, które zostało wybrane dla zmaksymalizowania kompatybilności z algorytmem SHA-3-256.
Diagram adapted from Ethereum EVM illustrated
Removed as we should probably show memory and account storage too if showing stack-->
Podczas wykonywania EVM przechowuje pamięć przejściową (w postaci tablicy bajtów z adresami słów), która jednak nie jest trwała między transakcjami.
Kontrakty jednak zawierają drzewo pamięciowe Merkle Patricia (jako adresowalną tablicę słów), powiązane w wiadomości z odpowiednim kontem i częścią stanu globalnego.
Skompilowany kod bitowy inteligentnego kontraktu wykonywany jest jako szereg kodów operacyjnych EVM, które przeprowadzają standardowe operacje na stosie, takie jak XOR
, AND
, ADD
, SUB
itp. EVM implementuje również szereg operacji stosu specyficznych dla blockchaina, takich jak ADDRESS
, BALANDCE
, SHA3
, BLOCKHASH
itp.
Schemat zaadaptowany z Ethereum EVM illustrated
Implementacja EVM
Wszystkie implementacje EVM muszą być zgodne ze specyfikacją opisaną w Yellowpaper Ethereum.
W ponad pięcioletniej historii Ethereum, EVM przeszło kilka gruntownych weryfikacji, w ciągu tego czasu znajdziemy również kilka implementacji EVM w różnych językach programowania.
Wszyscy klienci Ethereum posiadają implementacje EVM. Dodatkowo jest tu kilka samodzielnych implementacji, włącznie z:
- Py-EVM - Python
- evmone - C++
- ethereumjs-vm - JavaScript
- eEVM - C++
- Hyperledger Burrow - Go