以太坊evm虛擬機(WEB3系列教程之入門篇——5. 以太坊虛擬機(EVM))
以太坊網絡的存在僅僅是為了保持狀態機(即以太坊區塊鏈)的單一、連續、不間斷和不可變的操作。它是所有以太坊賬戶、智能合約和數據所在的環境。在任何給定的區塊中,以太坊都有一個也是唯一一個全球公認的“狀態”。以太坊虛擬機 (EVM) 定義了從塊到塊計算新的有效狀態的規則。
先決條件
理解 EVM 需要對字節[1]、內存[2]和堆棧[3]有一些基本的了解。
熟悉一些密碼學(如散列函數[4])也可能會有所幫助。
以太坊作為狀態機
像比特幣這樣的區塊鏈通常被描述為“分布式賬本”,它使用密碼學的基本工具來實現去中心化貨幣的存在。
加密貨幣的行為可以像“正常”貨幣一樣,因為規則規定了人們可以做什么和不可以做什么來修改這個分類帳。例如,一個比特幣地址不能花費比它之前收到的更多的比特幣。這些規則支持在比特幣以及類似的其他區塊鏈上發生的所有交易。
雖然以太坊也有其原生加密貨幣以太幣,但它還支持我們已經看到的更強大的功能——智能合約。對于這個更復雜的功能,我們需要一個比“分布式賬本”更強大的類比。
以太坊可以描述為分布式狀態機[5],而不是分布式賬本。狀態機本質上是可以響應某些輸入而從一種狀態變為另一種狀態的任何機器。
簡單的狀態機是一種投幣式旋轉門[6],常見于地鐵或火車站,用于防止人們進入,除非他們使用硬幣支付或有票。
旋轉門的初始狀態是鎖定的。在鎖定狀態下,如果你繼續推動它,它會保持鎖定狀態。如果您插入硬幣,它會進入解鎖狀態。如果您繼續插入硬幣,它會保持解鎖狀態。一旦您進入解鎖狀態(有人通過),它就會再次鎖定。
對于以太坊來說,狀態要復雜得多。它使用包含區塊鏈所有狀態的大型數據結構來描述。狀態如何從一個塊到另一個塊的變化的具體規則由 EVM 定義。
以太坊狀態轉換
在高層次上,EVM 的行為類似于數學狀態轉換函數。給定當前狀態和一組新的有效交易,它會產生一個新狀態。輸出是確定性的,這意味著對于相同的輸入,它總是會產生相同的輸出。
Y(S, T) = S'
給定舊的有效狀態S和一組新的有效交易T,狀態轉換函數Y產生新的有效狀態S。
以太坊中的狀態存儲為一個非常大的數據結構,稱為Merkle Patricia Trie。您不需要確切了解它的結構,但如果您愿意,可以閱讀給定的鏈接。
EVM層
EVM 作為以太坊軟件堆棧中的一個層存在。
以太坊節點包含 EVM 的實現,然后 EVM 可以在其上執行 EVM 代碼。EVM 代碼是編譯后的可以執行的智能合約字節碼。
EVM 代碼生成
EVM 指令(操作碼)
EVM 本身就像一個堆棧機器[7],堆棧上的最大深度為 1024 個項目。堆棧中的每一項都是一個 256 位(32 字節)的字。
在執行期間,EVM 維護一個臨時內存,作為一個 32 字節尋址的字節數組,它不會在事務之間持續存在。執行新事務時清除瞬態內存。
然而,智能合約確實在區塊鏈中維護自己的狀態。該狀態也被建模為Merkle Patricia Trie[8]。這通常被稱為事務執行期間的 EVM存儲。
EVM 具有允許其執行EVM Opcodes[9]的邏輯,這些操作碼在堆棧上執行標準操作,例如、 、 、XOR等ADD。EVMAND還實現了許多區塊鏈特定的堆棧操作,例如和。SUBMULBALANCEBLOCKHASH
當智能合約被編譯成字節碼(以十六進制表示)時,它會編譯成 EVM 操作碼。這些操作碼是在 EVM 上執行的。
EVM 實現
EVM 的所有實現都必須遵守以太坊黃皮書[10]中描述的規范。在以太坊的歷史上,EVM 經歷了多次修訂,現在存在多種編程語言的 EVM 實現。
所有以太坊客戶端都包含一個 EVM 實現。除此之外,還有多個獨立的實現。
Ethereum 客戶端 (with EVM)
? Geth[11] | Programming Language = Go
? OpenEthereum[12] | Programming Language = Rust
? Nethermind[13] | Programming Language = C# (.NET)
? Besu[14] | Programming Language = Java
? Erigon[15] | Programming Language = Go
獨立的EVM實現
? Py-EVM [16]| Programming Language = Python
? evmone[17] | Programming Language = C++
? ethereumjs-evm[18] | Programming Language = Javascript
? Enclave EVM[19] | Programming Language = C++
資料
以下是推薦的,但可選擇的閱讀/觀看內容,以了解更多關于EVM的信息。
? Ethereum EVM: Illustrated[20]
? EVM Opcodes[21]
? Ethereum Yellowpaper[22]
? Understanding EVM[23]
? Merkle Patricia Trie[24]
引用鏈接
[1] 字節: https://en.wikipedia.org/wiki/Byte
[2] 內存: https://en.wikipedia.org/wiki/Computer_memory
[3] 堆棧: https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
[4] 散列函數: https://en.wikipedia.org/wiki/Cryptographic_hash_function
[5] 狀態機: https://en.wikipedia.org/wiki/Finite-state_machine
[6] 旋轉門: https://i.imgur.com/Uh7m6jN.png
[7] 堆棧機器: https://en.wikipedia.org/wiki/Stack_machine
[8] Merkle Patricia Trie: https://eth.wiki/en/fundamentals/patricia-tree
[9] EVM Opcodes: https://ethereum.org/en/developers/docs/evm/opcodes/
[10] 以太坊黃皮書: https://ethereum.github.io/yellowpaper/paper.pdf
[11] Geth: https://geth.ethereum.org/
[12] OpenEthereum: https://github.com/openethereum/openethereum
[13] Nethermind: https://nethermind.io/
[14] Besu: https://consensys.net/quorum/developers/
[15] Erigon: https://github.com/ledgerwatch/erigon
[16] Py-EVM : https://github.com/ethereum/py-evm
[17] evmone: https://github.com/ethereum/evmone
[18] ethereumjs-evm: https://github.com/ethereumjs/ethereumjs-monorepo
[19] Enclave EVM: https://github.com/microsoft/eevm
[20] Ethereum EVM: Illustrated: https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
[21] EVM Opcodes: https://www.ethervm.io/
[22] Ethereum Yellowpaper: https://ethereum.github.io/yellowpaper/paper.pdf
[23] Understanding EVM: https://www.youtube.com/watch?v=RxL_1AfV7N4
[24] Merkle Patricia Trie: https://www.youtube.com/watch?v=OxofT39TJgg