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)開始,通過一個區塊又一個區塊的交易,轉變成最終狀態,也即以太坊當前的狀態,狀態中包含了所有的賬戶地址和其映射的賬戶狀態。

三分鐘讀懂 zkEVM:以太坊擴容方案的明珠

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 算法來提升證明及驗證效率。

三分鐘讀懂 zkEVM:以太坊擴容方案的明珠

Hermez zkEVM 在實現上的另外一個亮點,是其同時使用了兩套證明系統,具體來說即生成一個STARK 證明,然後再用PLONK 或Groth16 對這個STARK 證明生成一個證明並在一層進行驗證,這一過程就像是對證明的證明。之所以這麼做,是因為STARK 雖然很優秀,但是證明規模卻很大,在鏈上進行驗證時開銷也很大,而Groth16 或PLONK 卻擁有更小的證明規模和更快的驗證速度。這種兩相結合,各取所長的做法,很容易讓人想到非對稱加密算法和對稱加密算法結合使用的場景。

AppliedZKP zkEVM

AppliedZKP zkEVM 和Hermez 一樣,採用的是第一種策略。

AppliedZKP 採用數據總線(Bus Mapping)的思路,將存儲和計算分開。在Bus Mapping 抽取了正確的存儲數據的基礎上,由State proof 證明數據的一致性,EVM proof 證明計算邏輯的正確性。

三分鐘讀懂 zkEVM:以太坊擴容方案的明珠

具體的過程如下:

  • 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 則特殊實現其電路,最後使用遞歸聚合技術,將所有的證明聚合成一個,以提升效率。

三分鐘讀懂 zkEVM:以太坊擴容方案的明珠

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 擴容方案一定會綻現出自己的光彩。

如今的區塊鏈技術正進入了前所未有的大爭鳴時代。從公鏈之爭,到以太坊擴容方案之爭,甚至具體到一個擴容方案下,都有著不同的項目方正在前赴後繼,你追我趕。筆者十分慶幸,能身處這個區塊鏈技術最生機勃勃的大時代。

參考資料:

1. 以太坊工作原理

2. zkSync 2.0: Hello Ethereum!

3. Episode 175: zkEVM & zkPorter with Matter Labs

4. Episode 194: zkEVM with Jordi & David from Hermez

5. Exploring Popular zkEVM Solutions: AppliedZKP\, Matter Labs\, Hermez\, and Sin7Y

6. 技術解讀以太坊二層擴容方案Hermez 的zkEVM 設計思路

7. 技術解讀AppliedZKP 的zkEVM 方案設計思路