以太坊虛擬機 (EVM)
最後編輯: @comme.le.gnu(opens in a new tab), 2024年6月21日
以太坊虛擬機 (EVM) 是去中心化的虛擬環境,可以跨所有以太坊節點一致且安全地執行程式碼。 節點運行以太坊虛擬機來執行智慧型合約,使用「燃料」來衡量運算所需的算力,確保高效的資源分配和網路安全。
基本資訊
首先,對電腦科學之常用術語,例如字節位元組(opens in a new tab)、記憶體(opens in a new tab)及堆疊(opens in a new tab)等有一個基本認知,才能夠理解以太坊虛擬機。 熟悉密碼學/區塊鏈概念,如雜湊函式(opens in a new tab)和梅克爾樹(opens in a new tab)等也有幫助。
從帳本至狀態機
我們經常使用「分佈式帳本」這一比喻來描述比特幣一類的區塊鏈,區塊鏈透過使用一些基礎加密工具來支持去中心化貨幣。 帳本維護著活動記錄,並且必須遵守一套管控帳本修改相關操作的規則。 例如,比特幣地址無法花費超出其先前接受數量之比特幣。 此類規則構成比特幣及其他區塊鏈上所有交易的基礎。
盡管以太坊有著自己的原生加密貨幣(以太幣)且遵循幾乎相同的直觀規則,但它還支持一種更加強大的功能:智慧型合約。 對於此更為複雜的功能,需要一種更貼切之比喻來形容以太坊。 以太坊並非分佈式帳本,而是一種分佈式狀態機(opens in a new tab)。 以太坊狀態為一種龐大資料結構,其中不僅包含所有帳戶與餘額還包括機器狀態,機器狀態能夠遵照先前定義的一套規則在區塊之間變化並能執行任何機器程式碼。 在區塊之間變更狀態的具體規則由以太坊虛擬機定義。
此圖源於以太坊EVM圖解(opens in a new tab)
以太坊狀態轉換函式
以太坊虛擬機的運行類似於數學函式:提供一個輸入,就會生成確定的輸出。 因此,更加正式地描述以太坊具有狀態轉換函式將很有幫助:
1Y(S, T)= S'
提供一個舊的有效狀態 (S)
及一組新的有效交易 (T)
,以太坊狀態轉換函式 Y(S, T)
將生成一個新的有效輸出狀態 S'
。
狀態
在以太坊情境下,狀態為一個龐大的資料結構,稱為改進的梅克爾帕特里夏樹,該樹保存由雜湊值連接在一起的所有帳戶且可回朔至在區塊鏈上儲存的單一根哈希。
交易
交易為完全由帳戶指令加密簽章. 交易主要有兩種類型:一種交易發起訊息調用,一種啟動合約建立。
合約建立將建立一個新合約帳戶,其中包含已編譯的智慧型合約位元組碼。 當其他帳戶對該合約進行訊息調用時,將執行該合約的位元組碼。
以太坊虛擬機相關說明
以太坊虛擬機的執行類似於堆疊機(opens in a new tab),執行深度為 1024 個專案。 每個專案均為 256 位元的字,選擇它是為了方便用於 256 位元加密(例如,Keccak-256 雜湊或 secp256k1 簽章)。
執行過程中,以太坊虛擬機維持一個臨時記憶體(即字尋址字元陣列),該記憶體於交易間隔期間不存在。
然而,合約確實包含一棵梅克爾帕特里夏儲存樹(即字尋址字陳列),該樹與相關帳戶關聯且是全域狀態的一部分。
已編譯的智慧型合約位元組碼作為一些以太坊虛擬機作業碼執行,後者執行標準堆疊操作,例如 XOR
、AND
、ADD
、SUB
等。 以太坊虛擬機亦可透過一些區塊鏈特定的堆疊操作實作,例如 ADDRESS
、BALANCE
、BLOCKHASH
等。
圖表源於以太坊虛擬機圖解(opens in a new tab)
以太坊虛擬機實作
所有以太坊虛擬機實作均須遵照以太坊黃皮書中規定的相關規範。
在以太坊九年的歷程中,以太坊虛擬機經歷了數次修改,有著各種不同程式語言的以太坊虛擬機實作。
以太坊執行用戶端包含以太坊虛擬機實作。 此外,還有一些獨立的實作,包括:
- 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
延伸閱讀
- 以太坊黃皮書(opens in a new tab)
- Jellopaper 亦稱為 KEVM:K 框架中的以太坊虛擬機語意(opens in a new tab)
- The Beigepaper(opens in a new tab)
- 以太坊虛擬機作業碼(opens in a new tab)
- 以太坊虛擬機作業碼互動式參考資料(opens in a new tab)
- Solidity 文件簡介(opens in a new tab)
- 掌握以太坊 - 以太坊虛擬機 (EVM)(opens in a new tab)