---
title: "什麼是 zkEVM？"
description: "zkEVM 的類型、運作方式，以及其重要性"
---

# 什麼是 zkEVM？

零知識以太坊虛擬機（zkEVM）是一種產生[零知識證明](https://www.alchemy.com/overviews/snarks-vs-starks)以驗證程式正確性的虛擬機。zkEVM 的設計目的是以支援零知識技術的方式執行智慧合約。

zkEVM 是[零知識（ZK）Rollups](https://www.alchemy.com/blog/zero-knowledge-rollups)的一部分，這是一種 Ethereum 第二層擴容方案，透過將運算與狀態儲存移至鏈下來提升吞吐量。ZK-rollup 會將交易資料連同驗證鏈下交易批次有效性的零知識證明一起提交至 Ethereum。

早期的 ZK-rollup 無法執行智慧合約，僅能處理簡單的代幣交換與支付。但隨著相容 EVM 的零知識虛擬機出現，ZK-rollup 開始能支援 Ethereum [應用程式](https://www.alchemy.com/dapps/top/defi-dapps)。

本文將探討 zkEVM 的運作方式、其重要性，以及 zkEVM 有哪些類型。

## 什麼是 zkEVM？

zkEVM 是一種相容 EVM、支援零知識證明運算的虛擬機。與一般虛擬機不同，zkEVM 會證明程式執行的正確性，包括運算中使用的輸入與輸出的有效性。

以下進一步拆解這個定義，方便理解：

### EVM 相容性

[EVM（Ethereum Virtual Machine）](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)是部署在 Ethereum 網路上的智慧合約執行時所運作的環境。EVM 的功能就像一台「世界電腦」，為運作於 Ethereum 區塊鏈上的去中心化應用程式提供動力。

若一台虛擬機可以執行為 EVM 環境所編寫的程式，就稱其「相容 EVM」。這類虛擬機可以執行以 Solidity 或其他 Ethereum 開發常用高階語言編寫的智慧合約。zkEVM 之所以相容 EVM，是因為它們可以在不大幅修改底層邏輯的情況下執行 Ethereum 智慧合約。

### 支援零知識技術

EVM 從設計之初就未考慮支援零知識證明，這使得建構相容 EVM 且對零知識友善的虛擬機十分困難。不過，研究上的進展已在某種程度上使得將 EVM 運算包裝進零知識證明成為可能。

不同的 zkEVM 專案在結合 EVM 執行與零知識證明運算時，採用了不同的方法。每種方法各有取捨，本指南稍後會加以說明。

## zkEVM 如何運作？

與 EVM 一樣，zkEVM 也是一種因應程式操作而在不同狀態間轉換的虛擬機。但 zkEVM 更進一步，會為運算的每個部分產生正確性的證明。基本上，zkEVM 使用一種機制，證明前述執行步驟確實遵循了規則。

要理解 zkEVM 的運作方式（以及它與眾不同之處），先回顧一下 EVM 目前的運作方式。

### EVM 如何運作

Ethereum Virtual Machine 是一台狀態機，會因應某些輸入而從舊狀態轉移到新狀態。每次智慧合約執行都會觸發 EVM 狀態的改變（稱為「狀態轉換」）。以下是智慧合約交易過程中發生事情的概略說明：

1. 合約位元組碼（由原始碼編譯而成）會從 EVM 的儲存空間載入，並由 EVM 上的對等節點執行。節點使用相同的交易輸入，這保證每個節點都能得出相同的結果（否則它們無法達成共識）。

2. 位元組碼中包含的 [EVM Opcode](https://www.ethervm.io/) 會與 EVM 狀態的不同部分（記憶體、儲存空間與堆疊）互動。Opcode 執行讀寫操作——從狀態儲存空間「讀取」（取得）數值，並將新數值「寫入」（傳送）至 EVM 的儲存空間。

3. EVM opcode 會對從狀態儲存空間取得的數值進行運算，然後回傳新數值。這次更新會使 EVM 轉換到新狀態（交易因此被稱為「狀態轉換」）。這個新狀態會被其他節點複製，並持續存在直到下一筆交易執行為止。

<ImageBlock
  src="https://media.alchemy.com/1704295117-evm-execution-model.png"
  alt="顯示程式如何在 Ethereum Virtual Machine（EVM）中執行的示意圖。"
  width={968}
  height={707}
  caption="顯示程式如何在 Ethereum Virtual Machine（EVM）中執行的示意圖。"
/>

### zkEVM 如何運作

zkEVM 產生零知識證明，用以驗證每次運算中的各項元素：

1. **位元組碼存取**：正確的程式碼是否從正確的位址正確載入？

2. **讀寫操作**：a. 程式在運算前是否從堆疊/記憶體/儲存空間取得了正確的數值？ b. 程式在執行完成後是否將正確的輸出數值寫入堆疊/記憶體/儲存空間？

3. **運算**：Opcode 是否正確執行（亦即依序執行、沒有跳過步驟）？

#### zkEVM 的架構

zkEVM 分為三個部分：執行環境、證明電路（proving circuit）與驗證合約（verifier contract）。每個元件分別負責 zkEVM 的程式執行、證明產生與證明驗證。

##### 1. 執行環境

顧名思義，執行環境是 zkEVM 中執行程式（智慧合約）的地方。zkEVM 的執行環境運作方式與 EVM 十分相似：它接收初始狀態與目前交易，輸出新的（最終）狀態。

##### 2. 證明電路

證明電路產生零知識證明，用以驗證在執行環境中運算出的交易的有效性。證明產生過程以前狀態（pre-state）、交易輸入與後狀態（post-state）資訊作為輸入來完成。之後，證明者（prover）便可取得一份簡潔的證明，證明該特定狀態轉換的有效性。

<ImageBlock
  src="https://media.alchemy.com/1704293216-zkevm-validity-proofs.png"
  alt="顯示 zkEVM 如何為程式產生有效性證明的示意圖。"
  width={902}
  height={517}
  caption="zkEVM 產生有效性證明，以驗證程式執行結果的正確性。"
/>

##### 3. 驗證合約

ZK-rollup 會將有效性證明提交給部署在 L1 鏈（Ethereum）上的智慧合約進行驗證。輸入（前狀態與交易資訊）與輸出（最終狀態）也會一併提交給驗證合約。接著驗證者會對提供的證明執行運算，確認提交的輸出確實是由輸入正確運算而來。

## 什麼是 zkEVM opcode？

zkEVM opcode 是用於在相容 EVM 的 ZK-rollup 中執行程式的低階機器指令。與 EVM 一樣，以高階語言編寫的合約必須編譯為虛擬機可解讀的低階語言（位元組碼）。這份位元組碼指定了程式部署到虛擬機並執行時所使用的 opcode。

之所以需要 zkEVM opcode，是因為一般的 EVM opcode 在零知識證明電路中使用效率不佳。建立 zkEVM opcode 大致有兩種方法：

1. 為原生 EVM opcode 建構 ZK 電路
1. 為 ZK 證明運算建立新語言

#### 為原生 EVM opcode 建構零知識電路

這種方法需要在算術電路中實作所有 EVM 指令集——這是一項複雜且耗時的工作。好處是開發者可以使用[現有的區塊鏈開發工具](https://www.alchemy.com/overviews/20-blockchain-development-tools)建立智慧合約，或是將現有的 Ethereum 合約移植到 ZK-rollup，而不需大幅修改。

#### **為 ZK 證明運算建立新語言**

這種方法需要建構一種新語言——設計來支援有效性證明——並開發自訂的 opcode。開發者需要直接以新語言編寫合約，或是將 Solidity 原始碼編譯為自訂的 zkEVM opcode。

雖然這種方法通常比第一種方式更容易實作，但也有缺點。例如，開發者可能無法使用現有的 Ethereum 基礎設施與資源。

<ImageBlock
  src="https://media.alchemy.com/1704295202-zkevm-classification.png"
  alt="依 EVM 相容性對零知識虛擬機的分類。"
  width={937}
  height={587}
  caption="依 EVM 相容性對零知識虛擬機的分類。"
/>

## 建構 zkEVM 為何困難？

由於 EVM 在設計時並未考慮零知識證明運算，它具有一些對證明電路不友善的特性。以下簡要概述四項使 zkEVM 建構困難的因素：

1. 特殊 opcode
1. 基於堆疊的架構
1. 儲存空間額外開銷
1. 證明成本

### 1. 特殊 opcode

與一般虛擬機不同，EVM 使用特殊 opcode 來執行程式（CALL、DELEGATECALL）以及處理錯誤（REVERT、INVALID）等操作。這使得為 EVM 操作設計證明電路的過程更加複雜。

### 2. 基於堆疊的架構

EVM 採用基於堆疊的架構，雖然比基於暫存器的結構更簡單，但也增加了證明運算的難度。這正是為什麼一些知名的零知識虛擬機，例如 [ZkSync](https://www.alchemy.com/overviews/what-is-zksync-era) 的 zkEVM 與 StarkWare 的 StarkNet，改採基於暫存器的模型。

### 3. 儲存空間額外開銷

EVM 的儲存配置依賴 Keccak 雜湊函數與 Merkle Patricia Trie，這兩者都有很高的證明開銷。部分 zkVM（如 ZkSync）試圖透過替換 KECCAK256 函數來繞過此問題——但這可能破壞與現有 Ethereum 工具與基礎設施的相容性。

### 4. 證明成本

即使上述問題都獲得解決，仍然要面對證明產生的過程。產生零知識證明需要專門的硬體，以及大量的時間、金錢與心力投入。

雖然這份清單並不完整，但已呈現出阻礙相容 EVM 之 zkEVM 建構的部分問題。儘管如此，[零知識技術的多項突破](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now)已使得緩解這些問題成為可能——也讓 zkEVM 解決方案重新受到關注。

## zkEVM 為何重要？

建構出功能完整的 zkEVM，將有助於推動相容 EVM 的 [ZK-rollup 專案](https://www.alchemy.com/overviews/zk-rollup-projects)發展。這帶來以下幾項優勢：

1. 安全的可擴展性
1. 更低的成本
1. 更快的最終確定性與資本效率
1. 網路效應

### **1. 安全的可擴展性**

依照協定規則，所有驗證節點都必須重新執行 Ethereum Virtual Machine 中進行過的所有運算。這種方式確保了安全性，因為 Ethereum 節點可以獨立驗證程式的正確性，但也限制了 Ethereum 網路可處理的可擴展性（僅約 15-20 筆交易）。

相容 EVM 的 ZK-rollup 可以在不損害網路安全性的情況下解決 Ethereum 的吞吐量問題。與其他擴容協定一樣，ZK-rollup 不受 Ethereum 共識協定規則的束縛，可以針對執行速度進行最佳化。部分估計指出，[ZK-rollup 每秒可處理約 2000 筆交易](https://blog.matter-labs.io/optimistic-vs-zk-rollup-deep-dive-ea141e71e075)，且無需負擔 Ethereum 的高額手續費。

不過，相較於其他擴容專案，ZK-rollup 具備更高的安全保證；它們以有效性證明來驗證鏈下運算的正確性。這表示 L2 智慧合約執行的交易，可以在 L1（Ethereum）上被可靠地驗證，而無需節點重新執行這些操作。這可以大幅提升 Ethereum 的處理速度，同時不降低安全性。

### **2. 更低的成本**

Rollups 透過將交易資料以 CALLDATA 的形式寫入 Ethereum，從 [Ethereum Mainnet](https://www.alchemy.com/rpc/ethereum) 取得安全性保障。不過，樂觀 rollup（optimistic rollup）與 ZK-rollup 在需要於 Ethereum 上發布多少資料方面有所不同。

由於[樂觀 rollup](https://www.alchemy.com/overviews/optimistic-rollups)不提供鏈下交易的有效性證明，它們需要將所有與交易相關的資料（包括簽章與交易參數）都發布至鏈上。若不把所有資料都放到鏈上，挑戰者便無法建構用於爭議無效 rollup 交易的詐欺證明。

相反地，ZK-rollup 只需向 Ethereum 提交極少量資料，因為有效性證明本身已經保證了狀態轉換的可信度。zkEVM 甚至可以省略交易輸入，只發布最終狀態變化，進一步減少 CALLDATA 的需求。

這對開發者與使用者都有利，因為 [rollup 成本中很大一部分](https://forum.celestia.org/t/ethereum-rollup-call-data-pricing-analysis/141)來自於將資料發布到鏈上。透過將 CALLDATA 降到最低，ZK-rollup 可以讓去中心化交易所、NFT 市場、預測市場等各類應用程式的使用成本更便宜。

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

除了更高的安全性之外，ZK-rollup 相較於樂觀 rollup 還有另一項優勢：更快的最終確定性。區塊鏈中的最終確定性，是指一筆交易變得不可逆所需的時間；只有當網路參與者擁有客觀的有效性證明時，交易才能被確定。

在 ZK-rollup 中，於 zkEVM 中執行的交易，通常在提交至 Ethereum 後便立即最終確定。由於每個交易批次都附帶可立即驗證的有效性證明，Ethereum 主鏈可以迅速套用狀態更新。

由於樂觀 rollup 只提交不附帶證明的虛擬機交易，因此必須等待挑戰期結束後，交易才能達到最終確定。挑戰期為期 1-2 週，在此期間任何人都可以在交易提交至 Ethereum 後對其提出挑戰。

較慢的最終確定性對使用者體驗有多方面的影響。舉例來說，使用者在延遲期結束前無法從 rollup 中提領資產。流動性提供者或許可以緩解這個問題，但若提領涉及高價值資產甚至 NFT，這個方案可能就不太有效。

zkEVM 完全沒有上述這些問題。更快的最終確定性，對於需要在資產間（尤其是 L1 與 L2 之間）無縫移動資產的高階使用者非常有利，例如 NFT 交易者、DeFi 投資者或套利交易者。

### 4. 網路效應

建構相容 EVM 的 zkVM 最重要的原因，是能夠善用 Ethereum 的網路效應。作為全世界最大的智慧合約平台，Ethereum 擁有龐大的生態系，能為開發者與專案帶來價值。

舉例來說，開發者可以取用經過實戰考驗且經過稽核的程式碼庫、豐富的工具、文件等等。若建立一個與 Ethereum 基礎設施不相容的新 zkVM，將使各專案與開發團隊無法善用 Ethereum 的網路效應。

## 有哪些類型的 zkEVM？

目前的 zkEVM 專案主要分為兩大類：支援原生 EVM opcode 的 zkVM，以及使用自訂 EVM opcode 的 zkVM。以下比較不同的 zkEVM 協定，並說明其運作方式：

### Polygon zkEVM

Polygon Hermez 是一個 [Polygon ZK-rollup](https://www.alchemy.com/overviews/polygon-zk-rollups)，配備一台專為支援 EVM 相容性而設計的零知識虛擬機。作法是將 EVM 位元組碼編譯為「微 opcode」，並在 uVM 中執行——這是一台使用 SNARK 與 STARK 證明來驗證程式執行正確性的虛擬機。

結合這兩種證明類型是一項策略性決定。STARK（Scalable Transparent ARgument of Knowledge）證明產生速度較快，而 SNARK（Succinct Non-Interactive Argument of Knowledge）證明體積較小，在 Ethereum 上驗證的成本較低。

Polygon Hermez zkEVM 使用 STARK 證明電路，為狀態轉換產生有效性證明。接著會用一份 STARK 證明來驗證這些 STARK 證明的正確性（可以想成是產生「證明的證明」），並將其提交至 Ethereum 進行驗證。

### zkSync zkEVM

zkSync 是由 Matter Labs 開發、由自家 zkEVM 驅動的相容 EVM ZK-rollup。zkSync 透過以下策略達成與 Ethereum 的相容性：

1. 將以 Solidity 編寫的合約程式碼編譯為 Yul，這是一種可編譯為不同虛擬機位元組碼的中介語言。

2. 使用 LLVM 框架，將 Yul 位元組碼重新編譯為專為 zkSync zkEVM 設計、與電路相容的自訂位元組碼集。

與 Polygon Hermez 一樣，zkSync zkEVM 是在語言層級而非位元組碼層級達成 EVM 相容性。舉例來說，zkSync 的 zkEVM 不支援傳統的乘法與加法 opcode（ADDMOD、SMOD、MULMOD）。

### Scroll zkEVM

[Scroll](https://scroll.io/blog/zkEVM) 是一個正在開發中的新零知識 EVM 實作。Scroll 團隊計畫為每一個 EVM opcode 設計零知識電路。這將讓開發者能夠在 Scroll 上部署 Ethereum 原生的智慧合約，而無需修改底層的 EVM 位元組碼。

除此之外，Scroll zkEVM 還會使用「密碼學累加器（cryptographic accumulator）」來驗證儲存內容的正確性。這用於證明合約位元組碼是從指定位址正確載入的。

它也提供了一個電路，用於將位元組碼與執行軌跡（execution trace）連結起來。執行軌跡是一個序列，指定了執行了哪些虛擬機指令以及其執行順序。證明者會在產生證明時提交執行軌跡，以驗證運算與原始位元組碼是否一致。

### AppliedZKP zkEVM

[Applied ZKP](https://github.com/privacy-scaling-explorations/zkevm-specs) 是一個由 Ethereum Foundation 資助的專案，旨在開發相容 EVM 的 ZK-rollup，以及為 Ethereum 區塊產生有效性證明的機制。後者至關重要，因為將區塊與有效性證明配對，可以省去節點重新執行區塊的必要。

Applied ZKP 的創新之處在於將運算與儲存分離。它使用兩種類型的有效性證明——**狀態證明（state proof）**與 **EVM 證明（EVM proof）**：

#### **狀態證明**‍

檢查涉及儲存空間、記憶體與堆疊的操作是否正確發生。狀態證明本質上是在驗證讀寫操作的準確性。

#### **EVM 證明**

檢查運算是否在正確的時機呼叫了正確的 opcode。EVM 證明驗證運算本身，同時也確認狀態證明針對每個 opcode 都執行了正確的操作。

AppliedZKP zkEVM 使用一種「匯流排映射（bus mapping）」來連結狀態證明與 EVM 證明。此外，兩種證明都必須通過驗證，Ethereum 區塊才會被視為有效。

## zkEVM 的開發進度目前到哪裡了？

除了 zkSync 之外，大多數零知識 EVM 仍處於開發階段。儘管如此，零知識技術的持續發展，意味著出現功能完整的 zkEVM 的前景比以往任何時候都更加樂觀。

與此同時，開發者可以透過 StarkNet 零知識虛擬機來善用零知識應用程式的優勢。StarkNet 並不相容 EVM，但可以將 Solidity 原始碼編譯為對 ZK 友善的自訂位元組碼。你也可以選擇直接以 Cairo（StarkNet 的語言）編寫合約。

立即免費註冊 Alchemy，開始[在 StarkNet 上建構應用程式](https://www.alchemy.com/layer2/starknet)。

## 常見問題

### zkEVM 代表什麼？

zkEVM 是 Zero-Knowledge Ethereum Virtual Machine 的縮寫，是一種在執行智慧合約的同時產生零知識證明以驗證正確性的虛擬機。

### zkEVM 與標準 Ethereum 虛擬機有何不同？

zkEVM 相容 EVM，但會產生零知識證明來驗證交易的有效性，讓鏈下執行搭配鏈上驗證，藉此提升可擴展性。

### zkEVM 有哪些主要元件？

zkEVM 由三個部分組成：執行智慧合約的執行環境、產生零知識證明的證明電路，以及在 Ethereum 第一層上檢查證明的驗證合約。

### zkEVM 的用途是什麼？

zkEVM 為 ZK-rollup 提供動力，這是一種 Ethereum 第二層擴容方案，會將交易批次在鏈下處理，並將有效性證明提交至第一層，以實現更快、更便宜的執行。

### 為什麼 zkEVM 難以建構？

建構 zkEVM 之所以具有挑戰性，是因為 EVM 在設計時並未考慮零知識證明，具有特殊 opcode、基於堆疊的架構、儲存空間額外開銷，以及較高的證明成本，使電路設計更加複雜。

### 相較於樂觀 rollup，zkEVM 如何提升可擴展性？

zkEVM 透過有效性證明提供即時的最終確定性，省去了樂觀 rollup 所需的 1-2 週挑戰期，從而實現更快的交易處理。

### 什麼是 zkEVM opcode？

zkEVM opcode 是用於在 ZK-rollup 中執行程式的低階機器指令，建立方式為替原生 EVM opcode 建構 ZK 電路，或是開發對 ZK 友善的新語言。

### zkEVM 實作有哪些範例？

範例包括 Polygon zkEVM（使用微 opcode 與 SNARK/STARK 證明）、zkSync（將 Solidity 編譯為自訂位元組碼），以及 Scroll（為每個 EVM opcode 設計電路）。
