目前有多個團隊在進行zkEVM 的研究,本篇將對這些zkEVM 設計方案進行詳解。
自從以太坊ZK-Rollups 技術大爆發以來,各種ZKR Layer2 方案百花齊放,有Order-list 的去中心化交易所Loopring,有AMM 的去中心化交易所ZKSwap,有支持隱私的zk.menoy 等等。這些ZK-Rollups 方案豐富了以太坊Layer2 生態,安全性由Layer1 來保證,可以稱之為“最”安全的以太坊擴展方案。但是這些方案也只能支持特定應用的場景,不能支持通用的合約開發,究其原因,是因為ZKP 的通用電路本身就非常複雜,且受限於以太坊Gas/數據等的限制,設計和實現非常複雜,可以說zkEVM 是以太坊擴容方案這顆皇冠上的明珠。目前有多個團隊在進行zkEVM 的研究,本篇將對這些zkEVM 設計方案進行詳解。
zkEVM 的基本流程:
- 交易tx 先在EVM 執行器執行(執行需要交易相關的pre_state + tx等),得到post_state
- pre_state、tx、post_state 輸入到zkEVM,執行後得到proof
- Proof 和Public Input(關鍵數據)上傳到L1 合約進行驗證
本文要說的重點zkEVM,按照zk 證明的對象,大體分為兩類:
- 對原生EVM 的證明,包含對原生Opcode 的zk 實現。這類方案的研究團隊有AppliedZKP、Sin7Y 等。
- 對自定義EVM 的證明,包含對自定義操作碼的zk實現。這類方案的研究團隊有Hermez、Matter Labs 等。
zkEVM 現狀
zkEVM 方案概覽
EVM 基本模型
在開始介紹各方案的zkEVM 之前,有必要講講EVM 的基本模型,主要是操作和狀態的關係,如下圖:
圖片來自Ethereum EVM illustrated
EVM 的opcode在執行中,需要和Stack、Memory、Storage 進行交互,還需要一些Context 來進行上下文環境的記錄,如Gas/Program Counter 等。其中:Stack 只用於棧式訪問,Memory 可以隨機訪問,Storage 也可以隨機訪問。這些Opcode 的定義可參見EVM opcode 網站。
應用ZKP zkEVM
AppliedZKP 將Proof 分為兩種:
- State Proof:用於檢查Stack/Memory/Storage 中的狀態轉換的正確性。
- EVM Proof:用於檢查正確的opcode在正確的時間被調用,檢查Opcode本身的正確性,檢查Opcode 的有效性,還需對Opcode 執行過程中可能遇到的所有異常情況(比如out_of_gas)進行檢查。
這兩個Proof 前者檢查狀態,後者檢查操作,還需要Bus Mapping 將兩個Proof 連接起來,這個Bus Mapping不使用Merkle 樹,而是使用Plookup kv Mapping。
zkEVM 架構如下:
EVM proof 則使用Slot 的方式,將Opcode,Opcode 的操作值,Context 分開,如下圖,一個Circuit 由多個Slot 構成,q_op 是Selector,o_n 是Opcode 的值,c_n 是Context,v_n 是操作的值。
圖片來自ZKEVM EVM Circuit Explore
物質實驗室 zkEVM
Matter Labs 的zkEVM 設計方案又是另外一種,它將Solidity 和vyper 語言編寫的合約代碼,編譯成Yul,再通過LLVM 將Yul 代碼翻譯成zkEVM 支持的字節碼。
圖片來自’zkEVM’ – Alex Gluchowski at ETHGlobal
前段時間Matter Labs 開源了其Yul 編譯器,可以將中間碼YUL 編譯為自定義語法的字節碼,而字節碼可以運行在zkEVM 中,源碼見此處。
圖片來自’zkEVM’ – Alex Gluchowski at ETHGlobal
Matter Labs 的電路實現,是使用TinyRAM 來實現普通Opcode,如ADD,PUSH 等;對Gas 消耗巨大的Opcode,比如SHA256/keccak,特殊實現該電路;最後使用遞歸聚合技術,將所有的Proof 聚合成一個Proof。
赫梅茲zkEVM
Hermez 的zkEVM 方案同樣令人耳目一新,他們設計了uVM 架構,類似Intel X86 架構,分ROM/RAM 等模塊,通過主狀態機(Main State Machine)來同步模塊之間的狀態。 uVM 架構使用Register 而不是Stack,這樣完成同樣的工作,基於Register 的VM 所使用的指令數比基於堆棧的VM 所使用的指令數少,可以提高執行效率。再者,uVM 使用了大量的密碼學工具,來實現zk 完備。
圖片來自Hermez zkEVM介紹
Hermez 最創新的設計是將EVM 指令集翻譯為中間指令(Micro Opcode),中間指令可以在uVM 中執行。並且使用了大量的Plookup 算法來提升證明及驗證效率。
圖片來自Hermez zkEVM介紹
圖片來自Hermez zkEVM介紹
Sin7Y zkEVM
我們的zkEVM 借鑒了上面三個的設計,將狀態驗證和執行驗證分開,分為State Proof 和EVM Proof。
其中:
狀態證明:
- Stack Proof:驗證pop、push 等棧操作
- Memory Proof:驗證mload、mstore 等內存操作
- 存儲證明:sload、sstore 等 存儲操作
EVM證明:
使用Slot 的方式,暫定用Custom gate 的方式,將EVM 的Opcode 實現:
一個Slot 實現了所有的Opcode,能夠表達任意的Opcode。在合約中,會有多個Opcode,這時可以使用Selector 來選擇激活哪個Opcode。最終的合約電路將會包含多行Slot,全面支持EVM Opcode。
當然,在實際的方案設計和工程實現過程中,仍然面臨許多待確定和解決的問題,如:
1. EVM 到底是Native 的好,還是Customized 的好?
2. 對於Arithmetic ops,是單獨設計Lookup Table 還是設計公用的Lookup Table?
3. 如何約束Variable 的OP?
4. 多少個Custom Circuit 合適?數量太多則必須得用Recursive Aggreative,這樣會大大增加電路設計複雜度。
5. 是否考慮用Register 代替Stack 來縮減電路規模,提升zkEVM 執行效率?
6. 考慮到zkEVM 正式上線的時間,是否直接用BLS12-381 曲線?
7. Custom Slot 要處理所有的Arithmetic OPS 的計算,包含正確計算和錯誤計算,op type 是由Selector 指定,那麼正確or 錯誤的結果該如何指定?
8. Tinyram 是否真的能優化Arithmetic ops?
…
諸如以上的問題,如果我們尋找到了答案,會在後續的文章中詳細展示出我們的解決方案,請持續關注我們的官推以及其他官方賬號。也歡迎各位讀者參與研究討論。
引用
以太坊 EVM 圖示
zkEVM EVM 電路探索
‘zkEVM’ – ETHGlobal 的 Alex Gluchowski
編譯器-yul
介紹 Hermez zkEVM
展開全文打開碳鏈價值APP 查看更多精彩資訊