9 月 1 日凌晨,以太坊擴容網路 Arbitrum 宣布主網公測版本正式上線,與此同時 Optimism 則早已經向部分白名單應用開放,這標志著以太坊 L2 擴容方案的一支——Optimistic Rollup 正式登上了舞臺,
我們再將目光轉向 L2 擴容方案的另一支,ZK Rollup:
zkSync 于 8 月 31 日宣布推遲上線其 2.0 版本,基于 zkEVM,zkSync 2.0 有望成為首個兼容 EVM 的 ZK Rollup;
8 月 13 日,Polygon 宣布以 2.5 億美元收購以太坊二層擴容方案 Hermez,Hermez 的核心技術正是其 zkEVM 方案;
同樣是 8 月 13 日,以太坊基金會在定期公布其支持的團隊研究與開發進度的文章中表示,過去幾個月已經資助組建了一個團隊以進行 zkEVM 的研發,
我們知道,Vitalik 在比較兩種擴容方案時表示,短期 Optimistic Rollups 很可能在通用的 EVM 計算中勝出,但最終從中長期來看,隨著 ZK-SNARK 技術的改進,ZK Rollups 將在所有場景中勝出,其中所謂「ZK-SNARK 技術的改進」,主要就是指 zkEVM 的成功,
可見,zkEVM 已經成為以太坊擴容方案皇冠上的明珠。筆者希望通過本文,可以讓讀者了解 zkEVM 的基本原理與發展現狀。
zkEVM 的作用
要弄清楚 zkEVM 的作用,我們還需要一些前置知識。
我們先從以太坊講起,從本質上來講,以太坊是一個基于交易的狀態機,
從以太坊的創世紀狀態(Genesis State)開始,通過一個區塊又一個區塊的交易,轉變成最終狀態,也即以太坊當前的狀態,狀態中包含了所有的賬戶地址和其映射的賬戶狀態,
source:https://ethfans.org/posts/how-does-ethereum-work-anyway
其中具體負責處理交易的就是 EVM,即 The Ethereum Virtual Machine (以太坊虛擬機),EVM 作為一個堆棧機運行,程式員用高級語言例如 Solidity 來編寫代碼,隨后代碼被編譯成 EVM 可以理解的 EVM 字節碼,作為各種 EVM 指令執行標準的堆棧操作,最終產生一個新的狀態。
現在的問題來了,我們知道 ZK Rollup 方案需要對二層上的交易生成零知識證明,再傳回一層進行驗證,而要生成零知識證明,需要交易的處理過程符合 zk 電路證明的規范。而在 EVM 設計之初,顯然沒考慮過要支持零知識證明(畢竟那是 6,7 年前,零知識證明沒進入大多數人的視野),這就是 zkEVM 的意義:一種運行在 ZK Rollup 網路上,兼容 EVM 同時又對零知識證明友好的虛擬機。
兩種實現策略
對于 zkEVM,目前主要有兩種實現策略:
- 直接支持 EVM 現有的指令集,完全兼容 solidity 指令集,使用這種方案的包括 Hermez 和以太坊基金會 zkEVM,
- 重新設計一種虛擬機,該虛擬機對零知識證明友好,同時對 EVM 開發工具進行適配,來保持對 solidity 的兼容,使用這種方案的主要是 zkSync;
對于第一種策略,由于完全支持了 EVM 現有的指令集,其使用的是和 EVM 一樣的編譯器,因此天然就對現有的生態系統和開發工具完全兼容,同時還更好的繼承了以太坊的安全模型,
而對于第二種策略,由于不受原有 EVM 指令集的約束,可以更靈活的將代碼編譯成對零知識證明更友好的指令集,同時也擺脫了兼容所有 EVM 原有指令集所需要的艱巨而繁重的工作。
總的來說,第一種策略兼容性更好,安全性更高,但是工作量更大;第二種策略更靈活,工作量更小,但需要花費額外精力在適配上,
主要方案對比
Hermez zkEVM
Hermez 采用的是第一種策略,其將所有 EVM 指令集全部翻譯為中間指令(micro opcode)。
眾所周知,EVM 有一些變長的指令,比如 CALL,EXP,CREATE 等,這些指令天生對 zk 電路證明不友好,利用中間指令可以更友好地表達這些指令的邏輯。中間指令在 uVM 中執行,uVM 中使用了大量的密碼學工具,來實現 zk 完備,并且使用了 Plookup 算法來提升證明及驗證效率。
Hermez zkEVM 在實現上的另外一個亮點,是其同時使用了兩套證明系統,具體來說即生成一個 STARK 證明,然后再用 PLONK 或 Groth16 對這個 STARK 證明生成一個證明并在一層進行驗證,這一過程就像是對證明的證明,之所以這么做,是因為 STARK 雖然很優秀,但是證明規模卻很大,在鏈上進行驗證時開銷也很大,而 Groth16 或 PLONK 卻擁有更小的證明規模和更快的驗證速度,這種兩相結合,各取所長的做法,很容易讓人想到非對稱加密算法和對稱加密算法結合使用的場景。
AppliedZKP zkEVM
AppliedZKP zkEVM 和 Hermez 一樣,采用的是第一種策略,
AppliedZKP 采用數據總線(Bus Mapping)的思路,將存儲和計算分開,在 Bus Mapping 抽取了正確的存儲數據的基礎上,由 State proof 證明數據的一致性,EVM proof 證明計算邏輯的正確性。
具體的過程如下:
- EVM 通過 Bus Mapping 讀取需要的相關狀態,狀態由 Storage,Memory,Stack 三部分組成;
- EVM 執行 opcode;
- EVM 再通過 Bus Mapping 寫回新的狀態;
- 過程中 State proof 負責 Bus Mapping 讀寫資訊的一致性和正確性,EVM proof 負責 EVM 對 opcode 執行的正確性,
zkSync EVM
與 Hermez 和 AppliedZKP 不同,zkSync 選取了第二種策略,zkSync 的 zkEVM 并非 EVM 的復刻品,而是為了能夠運行 99% 的 Solidity 合約并確保其能夠在各種情況下(包括回滾和異常情況)正常工作而全新設計。與此同時,zkEVM 可以用來高效的在電路中生成零知識證明,
zkSync EVM 使用 TinyRAM 來實現普通指令集,而對 Gas 消耗巨大的指令如 SHA256/keccak 則特殊實現其電路,最后使用遞歸聚合技術,將所有的證明聚合成一個,以提升效率。
soruce: https://medium.com/matter-labs/zksync-2-0-hello-ethereum-ca48588de179
zkSync 同時開發了兩套針對 zkEVM 的編譯器前端: Yul 和 Zinc, Yul 是可以針對不同后端編譯成字節碼的中間 Solidity 表示;Zinc 則是基于 Rust 為智能合約和通用零知識證明電路開發的語言。這給予了開發者更大的選擇空間。
同時,在構建自己的編譯器時,zkSync 選擇了 LLVM,這一生產工業級產品最先進的編譯器框架,以確保編譯器足夠完備和擁有所有經典優化。
寫到最后
zkEVM 技術在多個優秀團隊的持續努力下,已經日漸成熟,相信在半年左右的時間內就會相繼落地,屆時兼容 EVM 的 ZK Rollup 擴容方案一定會綻現出自己的光彩。
如今的區塊鏈技術正進入了前所未有的大爭鳴時代,從公鏈之爭,到以太坊擴容方案之爭,甚至具體到一個擴容方案下,都有著不同的項目方正在前赴后繼,你追我趕。筆者十分慶幸,能身處這個區塊鏈技術最生機勃勃的大時代。