EVM:以太坊的核心
EVM(Ethereum Virtual Machine, 以太坊虛擬機)是以太坊的核心,負責運行智慧合約和處理交易。
虛擬機器通常用於真實電腦的虛擬化,通常由「虛擬機器管理程式」(如VirtualBox)或整個作業系統實例(如Linux 的KVM)進行虛擬化。它們必須分別提供實際硬體、系統呼叫和其他核心功能的軟體抽象。
EVM 在一個更有限的領域中運作:它只是一個運算引擎,因此提供了運算和儲存的抽象,例如類似於Java 虛擬機器(JVM) 規格。從高層次的角度來看,JVM 旨在提供與底層主機作業系統或硬體無關的執行時間環境,從而實現跨各種系統的兼容性。同樣,EVM 執行自己的字節碼指令集,這些指令集通常由Solidity 編譯而成。
EVM 是一個準圖靈完備的狀態機,”準”是因為所有執行步驟都會消耗有限的資源Gas,因此任何給定的智能合約執行都會限制在有限的計算步數內,避免了執行過程可能的死循環,從而導致整個以太坊平台停止的情況。
EVM 沒有調度功能,以太坊的執行模組從區塊中取出一個個交易,EVM 負責依序去執行。執行的過程中會修改最新的世界狀態,一筆交易執行完成後進行狀態累加,到達區塊完成後的最新的世界狀態。下一區塊的執行時又嚴格依賴上一個區塊執行後的世界狀態,所以以太坊的交易線性執行過程無法很好的進行並行執行最佳化。
從這個意義上說,以太坊協議約定交易是依照順序執行。雖然順序執行確保了交易和智慧合約能夠以確定性順序執行,保障了安全性,但在面臨高負載的情況下,可能會導致網路擁塞和延遲,這也是為什麼以太坊有極大的效能瓶頸,需要Layer2 Rollup 擴容的原因。
高性能Layer1 的平行之道
大多數高效能Layer1 都是基於以太坊無法並行處理的缺陷去設計自己的最佳化方案,這裡只聊執行層的最佳化,也就是虛擬機器和並行執行。
虛擬機
EVM 設計成一台256位元的虛擬機,目的是為了更容易處理以太坊的雜湊演算法,它會明確產生256位元的輸出。然而,實際運行EVM 的電腦則需要把256位元的位元組映射到本地架構來執行智慧合約,這使得整個系統變得非常低效且不實用。因此從虛擬機的選擇上,高效能Layer1 更多採用的是基於WASM, eBPF 字節碼或Move 字節碼的虛擬機,而非EVM。
WASM 是一種體積小、載入快、可移植且基於沙盒安全機制的字節碼格式,開發人員可以使用多種程式語言(C/C++、Rust、Go、AssemblyScript、JavaScript等)編寫智慧合約,然後編譯成WASM 字節碼並執行。 WASM 已被許多區塊鏈項目接納為標準,包括EOS,Dfinity,Polkadot(Gear),Cosmos(CosmWasm),Near 等,以太坊未來也會整合WASM,從而確保以太坊的執行層更加高效、簡單,適合作為完全的去中心化計算平台。
eBPF 前身是BPF(Berkeley Packet Filter ,伯克利包過濾器),原本是用於網路封包的高效過濾,後來演化形成了eBPF ,提供更豐富的指令集,允許在不改變源碼的情況下對操作系統內核進行動態幹預和修改其行為。後來這項技術從核心中走出來,發展出了用戶態eBPF 運行時,具有高效能、安全性和可移植性。 Solana 上執行的智能合約都會編譯成SBF(基於eBPF) 字節碼並在其區塊鏈網路上運行。
Move 是Diem 設計的一種新的智慧合約程式語言,注重靈活性、安全性和可驗證性。 Move 語言旨在解決資產和交易中的安全性問題,使得資產和交易能夠被嚴格定義和控制。 Move 的字節碼驗證器是一個靜態分析工具,分析Move 字節碼並確定是否遵守所需的類型、內存和資源安全規則,不需要在智能合約層級實現並在運行時檢查。 Aptos 繼承了Diem Move,Sui 則透過自身定製版本的Sui Move 來編寫其智能合約。
平行執行
區塊鏈中的並行執行意味著同時處理不相關的交易。把不相關的交易看成互不影響的事件。例如,如果兩個人在不同的交易平台上交易代幣,他們的交易可以同時處理。但是,如果它們在同一平台上交易,則可能需要按照特定的順序執行交易。
實現並行執行的主要挑戰是確定哪些交易是不相關的,哪些是獨立的,大多數高效能Layer1 依賴兩種方法:狀態存取方法和樂觀並行模型。
狀態存取方法需要預先知道每個交易可以存取區塊鏈狀態的哪一部分,從而分析出哪些交易是獨立的。代表方案是Solana 和Sui。
在Solana 中,程式(智慧合約)是無狀態的,因為它們不能自行存取(讀取或寫入)在整個交易過程中持續存在的任何狀態, 要存取或保持狀態,程式需要使用帳戶。 Solana 的每個交易必須指定在交易執行期間將存取哪些帳戶,以便交易處理執行時間可以調度非重疊交易並行執行,同時確保資料一致性。
在Sui Move 中,每個智能合約都是一個模組,由函數和結構定義組成。結構在函數中實例化,可以透過函數呼叫傳遞給其他模組。執行時期儲存的結構實例作為對象,Sui 中存在三種不同類型的對象,分別是擁有者對象,共享對象和不可更改對象。 Sui 的平行化策略與Solana 相似,交易也需要指定操作哪些物件。
樂觀並行模型在所有交易都是獨立的假設下運行,只是回顧性地驗證這一假設並在必要時進行調整。代表方案是Aptos。
Aptos 使用Block-STM (區塊軟體事務內存,Block Software Transactional Memory)的方法來應用樂觀並行執行。在Block-STM 中,交易首先在區塊內按照一定的順序進行設置,然後在不同的處理線程之間進行拆分,以便同時執行。在處理這些交易時,系統會追蹤每個交易變更的記憶體位置。在每一輪處理之後,系統檢查所有的交易結果。如果它發現某個交易觸及了由早期交易更改的記憶體位置,則擦除其結果並再次運行。這個過程一直持續到區塊中的每個交易都被處理完畢。
並行EVM
並行EVM(Parallel EVM)早在2021 年就被提起,那時候指的還是支援同時處理多個交易的EVM,旨在改進現有EVM 性能和效率,代表方案有Polygon 基於Block-STM 實現的平行EVM ,BSC 和NodeReal 合作開發的平行EVM。
但在2023 年底,Paradigm 的CTO Georgios Konstantopoulos 和Dragonfly 的Haseeb Qureshi 不約而同在展望2024 年趨勢時又提到了並行EVM,帶火了一波採用了並行執行技術的EVM 兼容Layer1,包括Monand 和Sei。
現如今,Solana 上的EVM 相容方案Neon,以太坊SVM(Solana 虛擬機)的Layer2 Rollup Eclipse,以太坊Move 虛擬機的Layer2 Rollup Lumio,模組化執行層Layer1 Fuel 都紛紛貼上了並行EVM 的標籤,令人眼花撩亂。
我認為合理的能定義成平行EVM 的只有以下三類:
-
沒有採用平行執行技術的EVM 相容的Layer1 的平行執行升級,例如BSC,Polygon;
-
採用了平行執行技術的EVM 相容的Layer1,例如Monand,Sei V2 以及Artela;
-
採用了並行執行技術的非EVM 相容的Layer1 的EVM 相容方案,例如Solana Neon。
BSC 和Polygon 作為最主流的兼容EVM 的Layer1 自不必多說,這裡簡單介紹下Monand,Sei V2,Artela 和Solana Neon。
Monad 是一個採用PoS 機制的兼容EVM 的高效能Layer1,旨在透過並行執行顯著增強可擴展性和交易速度。 Monad Labs 由Jump Trading 前研究負責人Keone Hon 創立。 Monad 允許在區塊內並行執行交易以提高效率。它使用樂觀並行模型,在上一步的執行完成之前就開始執行新交易。為了應對不正確的結果,Monad 追蹤輸入/ 輸出並重新執行不一致的交易。靜態程式碼解析器可以預測依賴關係,避免無效的並行性,並在不確定時恢復到簡單模式。這種並行執行增加了吞吐量,同時減少了交易失敗的可能性。
Sei 是基於Cosmos SDK 開發的Layer1,專為DeFI 設計的公鏈。 Sei 團隊成員兼具科技與傳統金融背景,曾任職於Robinhood、Databricks、Airbnb 及高盛等公司。 Sei V2 是對Sei 網路的大範圍升級,旨在成為第一個完全並行的EVM。與Monad 一樣,Sei V2 將使用樂觀並行化。這允許區塊鏈同時執行交易,而不需要開發人員定義任何依賴項。當發生衝突時,區塊鏈將追蹤每個交易觸及的儲存部分並按順序重新運行這些交易。這個過程將遞歸地持續下去,直到所有未解決的衝突都得到解決。
Artela 是一個可擴展的區塊鏈網絡,使開發人員能夠建立功能豐富的去中心化應用程式(dApps),核心成員來自螞蟻鏈。 Artela 推出的EVM++ 代表著高擴展性+ 高效能的平行EVM,分為兩個階段實現,第一階段將圍繞並行執行進行設計,在並行執行的基礎上,透過彈性運算保證網路節點算力可擴展,最終實現彈性區塊空間。其中並行執行會根據交易依賴衝突分析對交易進行分組以支援並行執行。
Solana Neon 是Neon Labs 開發的解決方案,用於在Solana 之上執行EVM 交易。 Neon EVM 實際上是Solana 上的智能合約,該合約內實作了EVM 解譯器,編譯為SBF 字節碼。 Neon EVM 內部實作了一套以太坊交易模型和帳戶模型,用戶只需要支付EVM GAS 費用即可發送交易。 Solana 網路的費用是由Neon Proxy 支付的。 Solana 強制要求交易提供帳戶列表,包裝交易也不例外,因此Neon Proxy 的職責包括生成這個帳戶列表,同時也獲得了Solana 的交易並行執行能力。
這裡補充一點,類似Solana Neon 將EVM 作為智能合約運行以實現EVM 兼容的方案還有Near Aurora 和EOS EVM+,理論上Aptos 和Sui 上也可以採用此方案來實現無侵入性的EVM 兼容,Movement Labs 正在做這樣的工作。 Movement 是一個模組化框架,用於在任何分散式環境中建立和部署基於Move 的基礎設施、應用程式和區塊鏈。 Movement 的Fractal 模組可以將EVM 操作碼無縫轉換為Move 操作碼,這意味著Solidity 專案可以利用Move 的效能和安全優勢,而無需一行Move 程式碼。
EVM 相容使得開發者可以輕鬆將他們的以太坊應用遷移到鏈上,而無需進行大規模修改,是一個很好地建立Aptos 和Sui 生態的方向。
總結
區塊鏈的平行技術已經是個老生常談的話題了,敘事每隔一段時間就會抬一次頭,但是目前主要都是對以Aptos 的Block-STM 機制為代表的樂觀執行模型的改造和模仿,沒有實質性的突破,所以熱度難以持續。
展望未來,還會有更多的新興的Layer1 專案加入並行EVM 的競爭,而對於一些舊的Layer1 也會實現EVM 並行升級或EVM 相容的方案,兩個方向殊途同歸,還會誕生更多與效能提升有關的新敘事。
不過比起高性能EVM 的敘事,我還是更希望區塊鏈能百花齊放,出現類似WASM,SVM 及Move VM 的敘事。