對於區塊鏈未來而言,zkEVM 將是十分重要

原文:Zero Knowledge EVMs: What is a zkEVM?

作者: Alchemy

編譯: zCloak Network

原用標題(譯後):什麼是 zkEVM(零知識以太坊虛擬機)?

前言

zkEVM 通過生成零知識證明來驗證程序的正確性,它以支持零知識技術的方式執行智能合約。

zkEVM 是 zk-rollups 的一部分。zk-rollups 是以太坊 L2 擴展解決方案,它通過將計算和狀態存儲轉移到鏈外來提高吞吐量,並將交易數據與零知識證明一起提交給以太坊,以驗證鏈外交易批的有效性。

早期的 zk-rollups 無法執行智能合約,只被局限地應用在簡單的代幣交換和支付之中。隨著引入 EVM 兼容的 zkVM,zk-rollups 才開始支持以太坊 dApps。

在這篇文章中,我們將探討 zkEVM 如何工作,為什麼它如此重要,以及目前有哪些類型的 zkEVM。

什麼是 zkEVM

zkEVM 是一個支持零知識證明計算的 EVM 兼容的虛擬機。與普通虛擬機不同,zkEVM 可以證明程序執行的正確性,包括操作中使用的輸入和輸出的有效性。

EVM 的兼容性

EVM 是一個 runtime 環境,用來執行部署在以太坊上的智能合約。EVM 的功能就好比是一台為運行在以太坊區塊鏈上的 dApps 提供動力的 “世界計算機” 。

如果一個虛擬機能夠運行那些可以在 EVM 環境中運行的程序,那麼它就是 “EVM 兼容” 的,這樣的虛擬機可以執行那些用 Solidity 或以太坊開發中使用的其它高級語言編寫的智能合約。也就是說,zkEVM 之所以 EVM 兼容,是因為它可以執行以太坊智能合約,且同時無需對底層邏輯進行大量修改。

支持零知識技術

EVM 在設計之時,並未考慮到要支持零知識證明,這使得構建 EVM 兼容的零知識友好虛擬機變得困難。不過伴隨研究方面的進展,使得可以將 EVM 的計算包裹到零知識證明中。

不同的 zkEVM 項目採用不同的方法結合 EVM 的執行和零知識證明的計算。每種方法都有各自的權衡考慮,這將在後文中探討。

zkEVM 是如何工作的?

與 EVM 一樣,zkEVM 也是一個基於程序操作結果而在不同狀態之間轉換的虛擬機。但 zkEVM 更進一步,它通過產生一個證明來證明計算的每一部分是正確的。本質上,zkEVM 使用一種機制來證明執行步驟是遵循了規則的。

為了理解 zkEVM 是如何工作的,讓我們先回顧一下 EVM 目前是如何工作的。

EVM 如何工作

EVM 是一個狀態機,它根據某些輸入從舊狀態轉換到新狀態。每個智能合約的執行都會觸發 EVM 狀態的變化(稱為"狀態轉換")。下面是一個智能合約交易過程中所發生情況的高級概述。

1. 合約字節碼(由源代碼編譯而成)從 EVM 的存儲中加載,並由 EVM 上的點對點節點執行。節點使用相同的交易輸入,以保證每個節點都將得到相同的結果(否則他們無法達成共識)。

2. EVM 操作碼(包含在字節碼中)與 EVM 狀態的各個部分(內存、存儲和堆棧)交互。操作碼執行讀寫操作(read-write operations)—— 從狀態存儲中讀取(獲取)數值,並將新數值寫入(發送)到 EVM 的存儲中。

3. EVM 操作碼在返回新數值之前,會對從狀態存儲中獲得的數值進行計算,這種更新會使 EVM 轉換到一個新的狀態(交易因此被稱為"狀態轉換")。這個新狀態被其它節點複製,直到另一個交易被執行。

如圖顯示了程序(智能合約)如何在 EVM 中執行

zkEVM 如何工作

zkEVM 通過生成零知識證明來驗證每次計算中的各種元素。

1. 字節代碼訪問:是否從正確的地址正確加載了適當的程序代碼?

2. 讀寫操作:    

a. 在計算之前,程序是否從堆棧/內存/存儲中獲取了正確的值?    

b. 在完成執行之後,程序是否將正確的輸出值寫入了堆棧/內存/存儲?

3. 計算:操作碼是否正確執行(即一個接一個,不跳步)

zkEVM 的結構

zkEVM 分為三個部分:執行環境、證明電路和驗證者合約。每部分都對 zkEVM 的程序執行、證明生成和證明驗證有所貢獻。

1. 執行環境

顧名思義,執行環境是程序(智能合約)在 zkEVM 中運行的地方。zkEVM 的執行環境功能很像 EVM:採取初始狀態和當前交易來輸出一個新的(最終的)狀態。

2. 證明電路

證明電路產生零知識證明,驗證在執行環境中計算交易的有效性。證明生成過程是通過使用前狀態、交易輸入和後狀態信息來作為輸入完成的。之後,證明者獲得該特定狀態轉換的有效性簡潔證明。

該圖顯示了 zkEVM 如何為程序生成有效性證明

3. 驗證者合約

zk-rollups 將有效性證明提交給部署在 L1 鏈(以太坊)上的智能合約以進行驗證。輸入(前狀態和交易信息)和輸出(最終狀態)也將會提交給驗證者合約。然後,驗證者對提供的證明進行計算,並確認提交的輸出是由輸入正確地計算出來的。

什麼是 zkEVM 操作碼?

zkEVM 操作碼是用於在 EVM 兼容的 zk-rollups 中執行程序的低級機器指令。與 EVM 一樣,用高級語言編寫的合約必須被編譯成虛擬機可以解釋的低級語言(字節碼),當在虛擬機中部署程序的時候,該字節碼指定了執行程序時所需使用的操作碼。

zkEVM 操作碼是非常有必要的,因為普通的 EVM 操作碼在零知識證明電路中的使用效率非常低。通常有兩種方法來創建 zkEVM 的操作碼:

  1. 為原生 EVM 操作碼建立零知識電路
  2. 為零知識證明計算創建新語言

為原生 EVM 操作碼建立零知識電路

這種方法需要在算術電路中實現所有的 EVM 指令集,是一項複雜而費時的任務。好處是開發者可以使用現有的區塊鏈開發者工具創建智能合約,或者將現有的以太坊合約移植到 zk-rollups,而無需對其進行大量修改。

為零知識證明計算創建新語言

這種方法需要為有效性證明開發一種新語言和自定義操作碼。開發人員直接用新語言編寫合約,或者將 Solidity 源代碼編譯為自定義的 zkEVM 操作代碼。

雖然這種方法通常比第一種方法更容易實現,但可能導致開發人員無法訪問現有的以太坊基礎設施和資源。

根據 EVM 兼容性,對 zkVM 進行分類。

構建 zkEVM 的困難點在哪裡

由於 EVM 在建造時並沒有考慮到零知識計算,所以它的一些特性對證明電路來說是不太友好的。以下四個方面是使構建 zkEVM 變得困難的主要原因:

  1. 特殊操作碼
  2. 基於堆棧的結構
  3. 存儲開銷
  4. 證明成本

1. 特殊操作碼

與普通的虛擬機有所不同,EVM 在程序執行(CALL、DELEGATECALL)和錯誤處理(REVERT、INVALID)等操作中使用了特殊的操作碼,它增加了 EVM 操作證明電路設計過程的複雜性。

2. 基於堆棧的架構

EVM 使用的基於堆棧的結構,雖然比基於寄存器的結構簡單,但增加了證明計算的難度。這就是為什麼那些著名的 zkVM,如 ZkSync 的 zkEVM 和 StarkWare 的 StarkNet 都使用基於寄存器的模型。

3. 存儲開銷

EVM 的存儲佈局依賴於 Keccak 函數和 Merkle Patricia Trie,這兩者的證明開銷都很高。一些 zkVM,如 ZkSync,試圖通過替換 Keccak 256 函數來避開這個問題,但這可能會破壞與現有以太坊工具和基礎設施的兼容性。

4. 證明成本

即使解決了上述問題,仍還需處理生成證明的過程。生成零知識證明需要專門的硬件,以及需要投資大量的時間、金錢和精力成本。

以上這些問題阻礙了建立與 EVM 兼容的 zkEVM。然而,零知識技術方面的一些突破,在一定程度上已經可以緩解這些問題帶來的影響,這使人們重新對 zkEVM 解決方案產生興趣。

為什麼 zkEVM 如此重要

建立功能齊全的 zkEVM 將鼓勵開發與 EVM 兼容的 zk-rollups 項目。這樣做有幾個優點:

  1. 安全的可擴展性
  2. 更便宜的成本
  3. 更快的最終確定性和資本效率
  4. 網絡效應

1. 安全的可擴展性

根據協議規則,所有驗證節點必須重新執行在 EVM 中進行的所有計算。這種方法確保了安全性,因為以太坊節點可以獨立驗證程序的正確性,但它限制了以太坊網絡的可擴展性,每秒只能管理 15-20 筆交易。

與 EVM 兼容的 zk-rollups 可以在解決以太坊吞吐量問題的同時,而不破壞網絡的安全性。和其它擴展協議一樣,zk-rollups 不受以太坊共識協議規則的影響,並且可以優化執行速度。一些估測資料顯示,zk-rollups 每秒可以處理約 2000 個交易,且不會產生高額費用。

除此以外,與其它擴展項目相比,zk-rollups 具有更高的安全保障—— 它們用有效性證明驗證鏈外計算的正確性。也就是說,智能合約在 L2 上執行的交易可以在 L1(以太坊)上得到可靠的驗證,但無需節點重新執行操作。這大大增加了以太坊的處理速度且不降低安全性。

2. 更便宜的成本

Rollups 通過將交易數據作為 CALLDATA 寫入以太坊,來承襲以太坊主網的安全性。不過 optimistic rollups 和 zk-rollups 需要在以太坊上發布的數據多少是有區別的。

由於 optimistic rollups 不提供鏈外交易的有效性證明,所以它們需要在鏈上發布所有與交易相關的數據(包括簽名和交易參數)。如果不把所有數據放在鏈上,挑戰者就無法構建用於爭議無效 rollups 交易的欺詐證明。

相反,即使只向以太坊發布最少的數據量,zk-rollups 也負擔得起。因為有效性證明已經保證了狀態轉換的可信性。zkEVM 甚至可以省略交易輸入,只發布最終的狀態變化,進一步減少對 CALLDATA 的需求。

這對開發者和用戶來說都是有益的,因為很大比例的 rollups 成本來自於在鏈上發布數據。通過將 CALLDATA 的調用減少到最低限度,zk-rollups 可以降低 dapps 的使用成本,比如去中心化的交易所、NFT 市場、預測市場等等。

3. 更快的最終確定性和資本效率

除了更好的安全性之外,zk-rollups 相較 optimistic rollups 還有一個優勢:更快的最終確定性。區塊鏈中的最終確定性是指交易變為不可逆所需的時間;只有當網絡參與者對交易的有效性有客觀證明時,交易才能最終完成最終確定性。

基於 zk-rollups,在 zkEVM 中執行的交易通常在發佈到以太坊上後立即被最終確定。歸功於每個交易批都帶有即時可驗證的有效性證明,以太坊主鏈可以快速應用狀態更新。

由於 optimistic rollups 只發布沒有證明的虛擬機交易,所以挑戰期必須在交易實現最終確定性之前結束。挑戰期長達 1-2 週,在此期間,任何人都可在交易提交給以太坊之後對其提出挑戰。

較慢的最終確定性對用戶體驗有很多影響。例如,在挑戰期結束之前,用戶不能從 rollups 中提取資產。或許流動性供應商願意解決這個問題,但如果提款涉及高額資產甚至 NFT,可能他們也無能為力了。

但 zkEVM 沒有上述這些問題。更快的最終確定性對於重量級用戶來說是非常好的,如 NFT 交易者、DeFi 投資者或需要無縫移動資產(特別是在 L1 和 L2 之間)的套利交易者。

4. 網絡效應

構建 EVM 兼容的 zkVM 的最重要原因是為了利用以太坊的網絡效應。以太坊作為世界上最大的智能合約平台,擁有一個為開發者和項目提供價值的龐大生態系統。例如,開發人員可以訪問經過審計和戰鬥測試的代碼庫、廣泛的工具、文檔等。如若創建一個與以太坊基礎設施不兼容的新 zkVM, 則會阻斷項目和開發團隊利用以太坊的網絡效應。

存在哪些類型的 zkEVM

目前的 zkEVM 項目主要分為兩類:支持原生 EVM 操作碼的 zkVM,和使用定制 EVM 操作碼的 zkVM。接下來我們將比較不同的 zkEVM 協議,並了解它們是如何工作的。

  • Polygon zkEVM

Polygon Hermez 是一個具有 zkVM 的 Polygon zk-rollup,旨在支持 EVM 的兼容性。為此,EVM 字節碼被編譯成 “微操作碼(micro opcodes)” 並在 uVM 中執行,uVM 使用 SNARK 證明和 STARK 證明來驗證程序執行的正確性。

將這兩種證明類型結合起來是一個戰略性的決定。STARK 證明的生成速度更快,SNARK 由於證明更小,所以在以太坊上驗證會更便宜。

Polygon Hermez zkEVM 使用一個 STARK 證明電路來生成狀態轉換的有效性證明,用 SNARK 證明驗證 STARK 證明的正確性(可以認為是生成"證明的證明"),並將 SNARK 證明提交到以太坊進行驗證。

  • zkSync zkEVM

zkSync 由 Matter Labs 開發,是一個由自己的 zkEVM 驅動的 EVM 兼容的 zk-rollups。ZkSync 通過以下策略實現了 EVM 兼容。

1. 將 Solidity 編寫的合約代碼編譯成 Yul。Yul 是一種可以被不同的虛擬機編譯成字節碼的中間語言。

2. 將 Yul 字節碼(使用 LLVM 框架)重新編譯為專為 zkSync zkEVM 設計的自定義、電路兼容的字節碼集。

與 Polygon Hermez 一樣,zkSync zkEVM 在語言層面實現了 EVM 的兼容性,而不是在字節碼層面。例如,zkSync zkEVM 不支持傳統的乘法和加法操作碼(ADDMOD、SMOD、MULMOD)。

  • Scroll zkEVM

Scroll 是一個正在開發的新的 zkEVM 實現。Scroll 團隊計劃為每個 EVM 操作碼設計零知識電路。這將允許開發人員在 Scroll 上部署以太坊原生智能合約 EVM,而無需修改底層 EVM 字節碼。

在其它方面,Scroll zkEVM 將使用 “加密累積器(cryptographic accumulator)” 來驗證存儲的正確性。這被用來證明合約字節碼從給定的地址被正確地加載。

它還提供了一個電路,用於將字節碼與執行跟踪聯繫起來。執行跟踪是一個序列,它指定了哪些虛擬機指令以何種順序被執行。證明者將在證明生成過程中提交執行跟踪,以驗證計算是否與原始字節碼一致。

  • AppliedZKP zkEVM

Applied ZKP 是一個由以太坊基金會資助的項目,旨在開發一個 EVM 兼容的 zk-rollup 和一個為以太坊區塊生成有效性證明的機制。後者是至關重要的,因為將區塊與有效性證明配對將消除節點重新執行區塊的需要。

Applied ZKP 的創新是將計算與存儲分離。它使用兩種類型的有效性證明—— 狀態證明和 EVM 證明。

  • 狀態證明

檢查觸及存儲、內存和堆棧的操作是否正確地發生。狀態證明本質上是驗證讀寫操作的準確性。

  • EVM 證明

檢查計算是否在正確的時間調用了正確的操作碼。EVM 證明驗證了計算本身,也確認了狀態證明對每個操作碼執行了正確的操作。

AppliedZKP zkEVM 使用一個總線映射來連接狀態證明和 EVM 證明。而且,在以太坊區塊被視為有效之前,這兩個證明都必須得到驗證。

zkEVM 的開發行至何處了?

除了 zkSync,大多數 zkEVM 仍在開發完善中。儘管如此,零知識技術的不斷發展意味著全功能的 zkEVM 的前景比以往任何時候都要好。

同時,開發者可以利用 StarkNet zkVM 來發揮零知識應用的優勢。StarkNet 雖然與 EVM 不兼容,但可以將 Solidity 源代碼編譯成自定義的零知識友好的字節碼。你也可以選擇用 Cairo(StarkNet 的語言)編寫合約。

免責聲明:作為區塊鏈信息平台,本站所發布文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。本文內容僅用於信息分享,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。