本文將對比zkEVM 和zkVM 在技術上的差異,並介紹RISC Zero zkVM 及其即將推出的Bonsai 網絡。關於RISC Zero,它是一個通用zkVM,RISC Zero zkVM 是一台可驗證的計算機,其工作方式類似於真正的嵌入式RISC-V 微處理器,使程序員能夠像編寫任何其他代碼一樣編寫ZK 證明。支持Rust 和C++ 編寫ZK 證明,並支持任何編譯為RISC-V 的語言。
背景
隨著當前智能合約的複雜性增加,dapp 越來越先進,區塊空間越來越稀缺,運行鏈上代碼的成本也在增加。換句話說,如果你的DeFi 邏輯變得計算昂貴,或者你的鏈上游戲邏輯需要額外的計算能力,你應該考慮使用zkVM 或zkEVM,將復雜的應用邏輯移到鏈外。
在這篇博文中,我想解釋在這種情況下,一個字母所能帶來的不同。我將從EVM 的概述開始,然後是zkEVM,再接著是zkVM。 zkEVM 允許你在鏈外傳輸Solidity 應用程序,而RISC Zero 的zkVM 和即將推出的Bonsai 網絡允許你使用Rust 編寫可擴展的、與鏈無關的代碼。
快速了解EVM:
EVM 是Ethereum Virtual Machine(以太坊虛擬機)的縮寫,你可以把它看作是執行Ethereum 上所有交易的軟件。
每個節點通過運行這個軟件(如geth 等實現)來參與以太坊網絡。在以太坊中,交易是由代碼表示的,其格式稱為EVM 字節碼,代表EVM 的指令。大體上,這些指令面向數學計算,來獲取區塊鏈信息,以及交換金錢。世界上有許多虛擬機,每一個都有自己的專長。以太坊的虛擬機很關鍵,因為它更適合應用於去中心化的金融(DeFi)。
什麼是「zk」,為什麼每個人都把它放在其他詞的前面?
最近最酷的趨勢之一是把「zk 」放在單詞的前面,這兩個字母代表零知識證明。維基百科上有很多例子(我最喜歡的是「兩個球和色盲的朋友」問題)。如果你對它們不熟悉,我建議此時花幾分鐘時間讀一讀零知識證明的例子。
長話短說,零知識證明能夠實現可驗證的計算。你可以把它看作是一種確保哪些計算被完成,以及計算結果是正確的方法。計算機就計算結果達成一致的一種方式是讓每台機器運行相同的代碼並比較結果。根據不同的計算,這對資源有限的系統來說可能很昂貴。通過使用像RISC Zero 這樣的零知識證明框架,機器可以通過檢查證明的數學有效性來確保計算的正確執行,而不是重複運行相同的代碼(如EVM)。
在RISC Zero,我們把這些證明稱為「收據」(receipts),在博客的其餘部分,我將使用這個術語。每張收據都包括一個加密標識符,表明進行了哪項計算,以及計算的任何公共輸出的日誌。雖然這可能看起來是一個簡單的概念,但它意味著機器可以生成收據來「證明」計算已經完成。
那麼,當你把zk 放在EVM 前面時會發生什麼?
術語zkEVM 是用來描述在EVM 字節碼引擎上運行智能合約的軟件,並為特定的計算(或交易)生成收據。這個軟件通常可以證明兩個或多個收據是有效的,並生成另一個收據。通過使用這種機制,zkEVM 可以運行許多交易,並使用一個收據來表示它,這被稱為「Rollup」。用Solidity 編寫的項目可以使用zkEVMs 來擴展交易,而不是在鏈上進行所有計算,在區塊鏈上發布一個單一的收據來代表許多發生在鏈外的交易。 zkEVM 有很多類型,如果你想了解它們,你可以在這篇文章中閱讀更多。
zkVM: 通過放棄E 來解鎖可驗證的計算
在RISC Zero,我們實現了一個零知識虛擬機(zkVM),而不是一個zkEVM。兩者之間的區別在於,「VM」,即「虛擬機」,比EVM 更通用。
在zkVM 上,你可以運行幾乎所有在計算機上運行的軟件,而不是任何可以在以太坊上運行的軟件。這種計算機使用RISC-V 架構,這是一套用於通用計算的指令。這意味著RISC-V 並沒有內置錢包地址或其他區塊鏈結構的概念。該指令集主要由在內存位置之間移動數據和對數據進行數學運算的運算符組成。雖然這個指令集可能看起來過於籠統,但並不要求程序員知道如何用彙編語言編程,以便為這個zkVM 編寫程序。
與EVM 相比,這個底層的RISC-V 模擬器允許程序員用Rust、C/C++ 和Go 等語言為zkVM 編寫程序(注意,我們目前支持Rust,我們對C/C++ 和Go 的支持目前正在進行中)。這意味著zkVM 的程序員可以使用別人在該語言的生態系統中開發的相關庫。一個例子是,我們可以運行玩Wordle 或Where’s Waldo 等遊戲的程序。然而,我們並不局限於簡單的遊戲:你可以運行許多其他編譯為RISC-V 的程序。
運行RISC-V 程序有什麼用?
如果你想了解更多幫助你寫出更好的DeFi 應用的框架,你可能會想知道為什麼我們正在研究RISC Zero 這樣一個通用的計算框架。
通過允許用戶使用通用語言編寫程序,我們打開了在Solidity 庫之外編寫代碼的可能性。這意味著應用邏輯不需要局限於可以用Solidity 表達的內容,並允許你寫出與鏈無關的代碼。像Rust 這樣的通用語言允許開發者比那些為特定目的而設計的語言更容易編寫不同類型的程序。例如,你可以用Rust 編寫一個簡單的算術計算器,它接受一個數學表達式作為輸入,運行數學計算,並將解決方案作為輸出返回。如果你增加這個計算器的複雜性,以支持常見的編程語言結構,如變量、循環和函數,你就實現了一個簡單的語言解釋器,將程序作為輸入,運行程序,並將解決方案作為輸出返回。這些程序可以被編譯成RISC-V 並在RISC Zero 的zkVM 上運行。有了Rust,你可以使用現有的crates 來為你的應用程序編程,而不是從頭開始編寫一切。
一個這樣的庫是Rust 上的revm crate。這個crate 是用Rust 編寫的EVM 的一個實現。通過使用這個crate,我們可以在zkVM 上運行一個EVM 字節碼解釋器。這意味著你可以在運行在zkVM 上的EVM 字節碼解釋器上運行solidity 合約! 通過這樣做,zkVM 會產生一個收據,代表運行智能合約的EVM 的執行。這在Odra 的這篇博文中已經進行了探討,並被zkPoEx 團隊用來提高bug 賞金。
如何擴展區塊鏈
隨著當前智能合約的複雜性增加,許多人發現他們維護的鏈上代碼只會隨著他們的開發而增加成本。換句話說,如果你的DeFi 邏輯逐漸變得計算昂貴,或者你的鏈上游戲邏輯需要額外的計算能力,RISC Zero 的zkVM 和即將推出的Bonsai 網絡允許你使用通用編程語言編寫可擴展的鏈上代碼。我在這篇博文中列舉了幾個例子,我們正處於真正可擴展的計算網絡的最開始。