---
title: "SNARKs 與 STARKS 與 Recursive SNARKs"
description: "ZK-proofs 的定義、優點與差異"
---

# SNARKs 與 STARKS 與 Recursive SNARKs

零知識證明（Zero-knowledge proofs）是一種機制，讓一方能向另一方證明自己知道某項資訊，卻不必揭露該資訊本身。ZK proofs 也被稱為有效性證明（validity proofs），最初是用於在注重隱私的區塊鏈中隱藏交易細節。

不過 ZK proofs 還有另一個重要的應用場景：擴展通用型區塊鏈。有了有效性證明，區塊鏈節點可以驗證交易，而不必儲存交易細節或重新執行運算。這能縮短確認時間，並提升網路吞吐量。

由於具備這種擴展性優勢，ZK proofs 已成為[區塊鏈擴展方案](https://www.alchemy.com/overviews/ethereum-scaling-solutions)的核心基礎設施，尤其是[zero-knowledge rollups](https://www.alchemy.com/blog/zero-knowledge-rollups)。本指南將介紹區塊鏈中使用的 ZK proofs 主要分類：ZK-SNARK、ZK-STARK，以及遞迴式 ZK-SNARK（recursive ZK-SNARKs）。

## 什麼是 ZK-SNARK？

ZK-SNARK 是一種用來產生零知識證明的協定，可在不揭露底層資料的情況下驗證資訊的真實性。這個縮寫代表 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge（零知識簡潔非互動式知識論證）。

ZK-SNARK 協定涉及兩方：證明者（Alice）與驗證者（Bob）。證明者（Alice）是提出主張的一方，而驗證者（Bob）則負責驗證該主張。

主張中所提及的資訊稱為見證（witness）或_秘密_。證明者（Alice）利用 ZK-SNARK 機制產生一份證明，向驗證者（Bob）證明該主張為真……而不必揭露相關資訊。

一個涉及 ZK-SNARK 的假設情境是使用者身分驗證。個人可以證明某個陳述（「我是美國公民」），而不必揭露個人資訊（例如護照或社會安全號碼）。

ZK-SNARK 之所以稱為 ZK-SNARK，是因為具備以下特性：

**1. 零知識（Zero-knowledge）**：意即除了主張的真偽之外，驗證者對該主張一無所知。

**2. 簡潔（Succinct）**：證明的大小夠小，驗證者能在很短的時間內完成驗證。

**3. 非互動式（Non-interactive）**：SNARK 之所以是非互動式的，是因為證明者與驗證者除了最初提交的證明外，不需要再交換其他資訊。早期的零知識證明系統要求證明者與驗證者交換多則訊息才能完成驗證。

**4. 論證（Argument）**：SNARK 是一種「運算上健全」（computationally sound）的陳述，符合嚴格的要求，因此很難作弊（也就是產生假證明）。

**5. 知識（Knowledge）**：若沒有底層資訊或_見證_，就無法建立以 SNARK 為基礎的證明。

<ImageBlock
  src="https://media.alchemy.com/1704289783-zk-snark.png"
  alt="ZK-SNARK 證明流程示意圖，顯示 prover 與 verifier 之間的互動"
  width={800}
  height={355}
  caption="來源：Altoros"
/>

### 區塊鏈中的 ZK-SNARK

分散式運算系統，例如公有區塊鏈，需要解決所謂的「運算完整性問題」（computational integrity problem）。運算完整性（computational integrity，CI）指的是特定運算所得到的結果是否正確。

在公有區塊鏈中，運算完整性指的是網路上執行的交易是否正確。大多數區塊鏈的做法是讓其他電腦（節點）重新執行每一筆交易。

然而，這種做法有其問題。強迫每個節點重播每一筆交易，會拖慢網路速度並限制擴展性。節點還必須儲存交易資料（否則就無法重播運算），導致區塊鏈的資料量呈指數成長。

但如果節點能夠在不重播運算的情況下驗證運算的正確性呢？這樣就能提升網路吞吐量，並免除節點儲存過多交易資料的需求。

這就是 ZK-SNARK 派上用場的地方。

透過 ZK-SNARK 產生的有效性證明，可以在不揭露輸入內容的情況下證明一筆交易的有效性。這也是為什麼像 Zcash 和 Monero 這類注重隱私的加密貨幣會使用 SNARK 來隱藏交易資訊。

SNARK 也能證明鏈下執行的運算的正確性，而不需要節點重播運算的每一個步驟。這正是 ZK-SNARK 對於區塊鏈擴展發揮作用之處。

用 SNARK 驗證鏈下運算是一個複雜的過程，首先要把運算編碼成一個數學表達式。這個數學陳述便構成有效性證明的基礎。

接著，驗證者會對該證明執行一項運算以檢查其正確性。若該證明通過所有檢查，底層的運算就會被視為有效。這正是 SNARK 之所以_簡潔_的原因——有效性證明的大小，遠比它所驗證的運算要小上許多倍。

<ImageBlock
  src="https://media.alchemy.com/1704289824-zk-snark-validation.png"
  alt="ZK-SNARK 有效性證明驗證鏈下運算的示意圖"
  width={1024}
  height={312}
  caption="來源：Finematics"
/>

### ZK-SNARK 與 ZK rollups

Rollup 是[一種用於 Ethereum 的 Layer 2 擴展方案](https://www.alchemy.com/overviews/ethereum-scaling-solutions)，透過鏈下執行來提升 Layer 1（L1）區塊鏈的吞吐量。Rollups 在 L2 鏈上處理交易，把多筆鏈下交易彙整成區塊，再提交至 L1 鏈。

透過把運算移出基礎層，rollups 能減少網路壅塞並擴展交易處理能力。

不過，L1 鏈仍需要知道鏈下執行的交易是否有效（也就是運算完整性問題）。否則，惡意行為者就能劫持該 rollup，並把不當交易提交至主鏈。

有一種 rollup（zero-knowledge rollup）使用 ZK-SNARK 向 L1 鏈證明鏈下交易的真實性。任何人都能驗證 SNARK 證明，這讓 L1 鏈能確信交易的有效性。

大多數使用 ZK-SNARK 的 ZK rollups 都遵循相同的架構：

1. L2 鏈上的使用者簽署交易並提交給驗證者（validators）。

2. 驗證者把交易壓縮成一個區塊，並產生對應的有效性證明（SNARK）。這提供了密碼學上的保證，證明新狀態是由有效交易的加入所產生。

3. L1 鏈上的智能合約會對該有效性證明執行一項運算。此運算的結果決定了批次交易是否通過驗證並提交至主鏈。

<ImageBlock
  src="https://media.alchemy.com/1704289877-zk-snark-and-zk-rollups.png"
  alt="ZK rollup 將 SNARK 有效性證明提交至 Ethereum L1 鏈的示意圖"
  width={987}
  height={495}
  caption="來源：Simon Brown"
/>

### ZK-SNARK 有哪些優點？

**使用 ZK-SNARK 有三大優點：高吞吐量、有效性證明體積小，以及安全性。**

#### 1. 高吞吐量

ZK-SNARK 藉由縮減 Ethereum 基礎層上的運算量來提升吞吐量。有了 ZK-SNARK，rollups 的 TPS 速率可以提升至數千筆。

ZK-SNARK 的體積通常比它所驗證的交易資料小上許多倍。這能減少基礎區塊鏈的壅塞，並帶來更低的 gas 費用和更快的交易速度。

#### 2. 證明體積小

SNARK 證明體積小，使其容易在主鏈上進行驗證。以 Ethereum 為例，這代表驗證鏈下交易所需的 gas 費用較低，也降低了最終使用者的 rollup 成本。

#### 3. 安全性

ZK rollups 之所以被認為比其他擴展方案更安全，主要是因為 ZK-SNARK 採用了尖端的密碼學安全機制。

ZK-SNARK 證明在運算上是健全的，這使得欺騙驗證者及進行惡意行為變得困難。ZK-SNARK 的非互動特性也意味著任何人都能以無需信任的方式（trustlessly）驗證證明。

### ZK-SNARK 有哪些缺點？

**使用 ZK-SNARK 有三大缺點：需要可信任設置（trusted setup）、容易受到量子運算攻擊，以及依賴特殊硬體。**

#### 1. 可信任設置

建立 ZK-SNARK 協定需要建立一個通用共同參照字串（Universal Common Reference String，CRS）。CRS 也被稱為_公開參數_（public parameters），能讓證明者與驗證者之間進行安全通訊。

若惡意行為者取得這些公開參數的相關知識，就能產生虛假的有效性證明。有些專案嘗試透過[使用多方運算](https://zkproof.org/2021/06/30/setup-ceremonies/amp/)（multi-party computation，MPC）來解決這個問題，也就是讓不同的個人參與產生這些公開參數。

不過，這種做法仍要求使用者信任參與者的誠信。這個問題相當棘手，因為區塊鏈的目的正是要減少對權威機構的信任需求。

#### 2. 容易受到量子運算攻擊

ZK-SNARK 使用橢圓曲線密碼學（Elliptic Curve Cryptography，ECC）來加密用於產生有效性證明的資訊。目前 ECC 相對安全，但量子運算的進展可能會破壞其安全模型。

#### 3. 依賴特殊硬體

用 ZK-SNARK 產生有效性證明是一個運算密集的過程，這代表證明者必須投資專門的硬體。由於能夠購買這類機器的人非常少，許多人認為 ZK-SNARK 的證明產生過程高度中心化。

### 哪些專案使用 ZK-SNARK？

**五個知名的 ZK-SNARK 應用專案分別是 ZKSync、Loopring、Aztec、Polygon Hermez 和 ZKSpace。**

#### zkSync

由 Matter Labs 打造、與 EVM 相容的 ZK rollup，運作於 Ethereum Mainnet 上。[ZKSync](https://www.alchemy.com/overviews/what-is-zksync-era) 支援智能合約、代幣交換、支付以及 NFT 鑄造。

#### Loopring

由基於 SNARK 的 ZK rollup 技術驅動的 Ethereum Layer 2（L2）專案。Loopring 同時也是一個去中心化交易所，可交易 ETH 和其他 ERC-20 代幣，成本只是 Ethereum Mainnet 上其他 DEX 收費的一小部分。

**Aztec**

建構於 Ethereum 網路上的開源 L2 網路。Aztec 運用 ZK-SNARK 來擴展交易處理能力，並提升使用者的財務隱私。

#### Polygon hermez

運作於 Ethereum 區塊鏈之上的 ZK rollup。Polygon Hermez 使用 ZK-SNARK 來支援安全且低成本的代幣轉帳與支付。

#### Zkspace

以 ZK-SNARK 為基礎的 ZK rollup 專案。ZKSpace 為 Ethereum 使用者提供更低的 gas 費用和更快的交易，並包含一個 AMM 型 DEX（ZKSwap v3）、支付網路（ZKSquare），以及[NFT 市場](https://www.alchemy.com/dapps/best/nft-marketplaces)（ZKSea）。

## 什麼是 ZK-STARK？

ZK-STARK 是 Zero-Knowledge Scalable Transparent Argument of Knowledge（零知識可擴展透明知識論證）的縮寫。與 ZK-SNARK 相同，ZK-STARK 能在不揭露陳述本身任何內容的情況下，證明該陳述為真。

除了少數差異之外，STARK 具備與 SNARK 相同的特性。基於 STARK 的有效性證明是利用一份資訊產生的，而這份資訊對驗證者是隱藏的。STARK 同樣能在不揭露輸入內容的情況下驗證交易的正確性。

### ZK-STARK 對比 ZK-SNARK

ZK-STARK 最主要的差異在於其可擴展性與透明性：

ZK-STARK 之所以被視為透明的，是因為它不需要通用共同參照字串（CRS）的可信任設置即可運作。相反地，STARK 協定使用公開可驗證的隨機性，來建立證明者與驗證者之間的互動。

ZK-STARK 之所以_可擴展_，是因為證明與驗證的複雜度相對於運算複雜度呈_擬線性_（quasilinearly）成長。而在 ZK-SNARK 中，證明與驗證的複雜度則相對於底層運算呈_線性_（linearly）成長。

這意味著，當我們需要驗證的運算規模變大時，ZK-SNARK 協定產生和驗證證明所需的時間會比 ZK-STARK 更長。這也是為什麼 STARK 更適合用於處理大量交易的應用場景。

<ImageBlock
  src="https://media.alchemy.com/1704289925-zk-starks-vs-zk-snarks.jpeg"
  alt="ZK-STARK 與 ZK-SNARK 特性比較表"
  width={1526}
  height={435}
  caption="來源：Adam Luciano"
/>

### ZK-STARK 有哪些優點？

**使用 ZK-STARK 有四大優點：不需要可信任設置、具備可擴展性、能為使用者帶來最大吞吐量，以及具有高度安全保證。**

#### 1. 不需要可信任設置

ZK-STARK 不需要可信任設置即可運作，而是依賴公開的隨機性。這減少了使用者所需承擔的信任假設，也提升了基於 STARK 的協定的安全性。

#### 2. 可擴展特性

相較於 SNARK，STARK 在大規模運算時能更快完成計算與驗證。更重要的是，即便底層運算的複雜度呈指數成長，ZK-STARK 仍能維持較低的證明與驗證時間。

#### 3. 最大吞吐量

和 SNARK 一樣，STARK 能透過實現安全且可驗證的鏈下運算來擴展區塊鏈的處理能力。

提交至 L1 鏈的一份 STARK 證明，就能驗證在主鏈之外進行的數千筆交易。因此，多個知名的 ZK rollup 專案採用 ZK-SNARK 來證明鏈下運算的完整性。

#### 4. 更高的安全保證

ZK-STARK 使用抗碰撞雜湊（collision-resistant hashes）進行加密，而非 ZK-SNARK 所使用的橢圓曲線方案。這被認為能抵抗量子運算攻擊，因此比 SNARK 所使用的橢圓曲線更為安全。

### ZK-STARK 有哪些缺點？

**使用 ZK-STARK 有兩大缺點：證明體積較大，以及該技術在區塊鏈領域的採用程度較低。**

#### 1. 證明體積較大

雖然 STARK 能提供更快速的證明，但缺點是這些證明的體積比基於 SNARK 的證明更大。這使得 STARK 證明在 Ethereum 上的驗證成本更高，因為運算較大的證明會產生更高的 gas 費用。

#### 2. 採用程度較低

SNARK 是零知識技術在區塊鏈中最早的實際應用，這也是為什麼它比 STARK 擁有更大的市場占有率。大多數 ZK rollups 使用 ZK-SNARK，而以 SNARK 為基礎的 ZK proofs 開發者生態系與工具也更為完善。

儘管 ZK-STARK 也擁有知名的支持者，包括 Ethereum Foundation，但其採用程度仍較低。因此，開發者在使用 STARK 建構 ZK 專案時，可能會發現支援和工具較少。

### 哪些專案使用 ZK-STARK？

#### StarkNet

通用型 ZK rollup，作為 Ethereum 上的 L2 網路運作。StarkNet 讓[去中心化應用程式](https://www.alchemy.com/dapps/top/defi-dapps)在不犧牲 Ethereum 去中心化與安全性的前提下，實現無上限的擴展性。

#### dYdX

以 Ethereum 為基礎的 ZK rollup 專案（同時也兼作去中心化交易所），為加密貨幣使用者與交易者提供快速且低成本的交易、借貸服務。[dYdX](https://www.alchemy.com/dapps/dydx) 使用 STARK 證明作為其安全機制的一部分，保障使用者資金的安全。

#### Polygon miden

基於 STARK、與 EVM 相容的 ZK rollup。雖然目前仍在開發中，但 Polygon Miden 上線時將成為第一個與 EVM 相容的 ZK-STARK 協定，讓開發者能將原生於 Ethereum 的應用程式遷移過來，享受 L2 網路帶來的擴展性。

## 什麼是遞迴式 ZK-SNARK？

**遞迴式（recursive）SNARK 系統會針對不同的交易區塊平行產生證明，並將這些證明彙整成單一區塊證明，再提交至主鏈，這代表一個 SNARK 可以驗證其他 SNARK。**

L2 rollup 仍然只在 Ethereum 上提交一份有效性證明。不過，這份「遞迴證明」（recursive proof）能驗證多個 L2 區塊中的交易，一旦鏈上合約接受該證明，這些交易就全部生效。

<ImageBlock
  src="https://media.alchemy.com/1704289960-recursive-zk-snark.png"
  alt="遞迴 ZK-SNARK 將多個區塊證明聚合為單一證明的示意圖"
  width={887}
  height={579}
  caption="來源：Matter Labs"
/>

### 遞迴式 ZK-SNARK 解決了什麼問題？

**遞迴式 ZK-SNARK 藉由把多個 L2 證明合併到提交給 L1 鏈的單一證明中，大幅提升能以 ZK proof 確認完成的交易數量，而這個數量目前受限於 Ethereum 12-14 秒的區塊時間（block time）。**

區塊時間指的是在 Ethereum 上挖出一個新交易區塊所需的時間。ZK rollups 每個區塊只能提交一筆鏈上交易（以及對應的有效性證明），這限制了它們能處理的交易數量。

### 遞迴式 ZK-SNARK 與一般 ZK-SNARK 有何不同？

遞迴式 ZK-SNARK 與一般 ZK-SNARK 的不同之處在於，遞迴式 ZK-SNARK 能把針對不同 L2 區塊所產生的多個 SNARK 合併成單一份提交至 L1 鏈的有效性證明，藉此驗證不只一個交易區塊。

ZK rollups 會在提交至主鏈之前，為每一批交易建立一份 SNARK 證明，而單一份 SNARK 證明只能驗證在 L2 rollup 上執行的一個交易區塊。

ZK-SNARK 能在不使用原始輸入的情況下，驗證已經由一般 ZK-SNARK 驗證過的交易。因此，鏈上智能合約無需以多個 SNARK 作為輸入，就能驗證更大範圍的鏈下運算。

### 什麼是 plonky2？

Plonky2 是一種新穎的證明機制，用於 Polygon Zero——一個提議中的[**Polygon ZK rollup**](https://www.alchemy.com/overviews/polygon-zk-rollups)，該方案使用遞迴式 ZK-SNARK 來提升交易處理量。

遞迴式 SNARK 藉由把數個證明彙整成一份遞迴證明來擴展證明產生的流程，而 Plonky2 採用相同的技術，來縮短產生新區塊證明所需的時間。

Plonky2 的證明機制會平行為數千筆交易產生證明，然後再遞迴地把它們彙整成單一區塊證明。這比傳統證明機制試圖一次性產生_整個_區塊證明的做法更有效率。

這種做法的優點顯而易見。

**Plonky2 能在 0.17 秒內產生一份遞迴證明**，使其成為目前速度最快的證明機制。此外，Plonky2 能在消費級裝置上產生證明，解決了一般基於 SNARK 的證明系統所面臨的硬體中心化問題。

## 結論

零知識證明已從保護隱私的技術，發展成為擴展技術的下一個前沿領域。隨著 ZK rollups 的蓬勃發展，可以肯定地說，ZK-SNARK、ZK-STARK 以及遞迴式 SNARK 將會在擴展 Ethereum 的過程中扮演重要角色。

Web3 開發者可以透過在 [StarkNet](https://www.alchemy.com/layer2/starknet/?a=cfdfbd6b96) 上建構應用來運用零知識技術，這是由 Alchemy 支援、以 STARK 驅動的 Ethereum ZK rollup。立即開始建構能無需權衡取捨即可擴展的應用程式吧！
