---
title: "什麼是零知識證明？"
metaTitle: "零知識證明"
description: "適合初學者的零知識證明非技術性介紹。"
lang: zh-tw
---

零知識證明是一種在不揭露陳述本身的情況下，證明該陳述有效性的方法。「證明者」是試圖證明某項申領的一方，而「驗證者」則負責驗證該申領。

零知識證明首次出現於 1985 年的一篇論文《[互動式證明系統的知識複雜度](http://people.csail.mit.edu/silvio/Selected%20Scientific%20Papers/Proof%20Systems/The_Knowledge_Complexity_Of_Interactive_Proof_Systems.pdf)》中，該論文提供了當今廣泛使用的零知識證明定義：

> 零知識協定是一種方法，透過這種方法，一方（證明者）**可以向**另一方（驗證者）**證明某件事是真實的，除了該特定陳述為真這個事實之外，不揭露任何資訊**。

多年來，零知識證明不斷改進，現在已應用於多個現實世界的應用程式中。

<VideoWatch slug="zero-knowledge-proofs-5-levels" />

## 為什麼我們需要零知識證明？ {#why-zero-knowledge-proofs-are-important}

零知識證明代表了應用密碼學的一大突破，因為它們承諾能提高個人資訊的安全性。想像一下，你可能如何向另一方（例如服務供應商）證明一項申領（例如「我是 X 國的公民」）。你需要提供「證據」來支持你的申領，例如國家護照或駕照。

但這種方法存在問題，主要是缺乏隱私。與第三方服務分享的個人識別資訊 (PII) 儲存在中央資料庫中，容易受到駭客攻擊。隨著身分盜用成為一個嚴重的問題，人們呼籲採用更能保護隱私的方式來分享敏感資訊。

零知識證明透過**消除揭露資訊以證明申領有效性的需求**來解決這個問題。零知識協定使用陳述（稱為「見證」）作為輸入，以產生其有效性的簡短證明。此證明提供了強而有力的保證，證明陳述為真，而不會暴露用於建立該證明的資訊。

回到我們先前的例子，證明你公民身分申領所需的唯一證據就是零知識證明。驗證者只需檢查證明的某些屬性是否成立，就能確信潛在的陳述也成立。

## 零知識證明的用例 {#use-cases-for-zero-knowledge-proofs}

### 匿名支付 {#anonymous-payments}

信用卡支付通常對多方可見，包括支付供應商、銀行和其他利益相關方（例如政府機構）。雖然金融監控有助於識別非法活動，但它也破壞了普通公民的隱私。

加密貨幣的初衷是為使用者提供一種進行私密、點對點交易的手段。但大多數加密貨幣交易在公共區塊鏈上都是公開可見的。使用者身分通常是假名，並且要麼是有意與現實世界身分連結（例如，在推特或 GitHub 個人資料中包含 ETH 地址），要麼是可以使用基本的鏈上和鏈下資料分析與現實世界身分關聯。

有些特定的「隱私幣」是專為完全匿名交易而設計的。注重隱私的區塊鏈（如 Zcash 和 Monero）會屏蔽交易細節，包括發送者/接收者地址、資產類型、數量和交易時間線。

透過將零知識技術融入協定中，注重隱私的[區塊鏈](/glossary/#blockchain)網路允許[節點](/glossary/#node)在不需要存取交易資料的情況下驗證交易。[EIP-7503](https://eips.ethereum.org/EIPS/eip-7503) 是一個提議設計的例子，它將在[以太坊](/)區塊鏈上實現原生的私密價值轉移。然而，由於安全性、監管和使用者體驗 (UX) 等綜合考量，此類提案難以實施。  

**零知識證明也正被應用於公共區塊鏈上的匿名交易**。一個例子是 Tornado Cash，這是一個去中心化的非託管服務，允許使用者在以太坊上進行私密交易。Tornado Cash 使用零知識證明來混淆交易細節並保證金融隱私。不幸的是，因為這些是「選擇性加入」的隱私工具，它們常與非法活動聯繫在一起。為了克服這個問題，隱私最終必須成為公共區塊鏈上的預設設定。了解更多關於[以太坊上的隱私](/privacy/)。

### 身分保護 {#identity-protection}

目前的身分管理系統將個人資訊置於風險之中。零知識證明可以幫助個人驗證身分，同時保護敏感細節。

零知識證明在[去中心化身分 (DID)](/decentralized-identity/)的背景下特別有用。去中心化身分（也稱為「自主身分」）賦予個人控制個人識別碼存取權限的能力。在不揭露你的稅務 ID 或護照細節的情況下證明你的公民身分，是零知識技術如何實現去中心化身分的一個好例子。

<Alert variant="info">
  <AlertEmoji text="💡" />
  <AlertContent>
    <AlertTitle className="mb-2">
      零知識證明 + 身分實際應用：以太坊上的不丹國家數位身分 (NDI)
    </AlertTitle>
    <AlertDescription>
      <p>
        將零知識證明用於身分管理系統的一個現實世界例子是建立在以太坊上的不丹王國國家數位身分 (NDI) 系統。不丹的 NDI 使用零知識證明讓公民能夠以密碼學方式證明關於自己的事實，例如「我是公民」或「我已年滿 18 歲」，而無需揭露其身分證上的敏感個人資料。
      </p>
      <p>
        在<a href="/decentralized-identity/#national-and-government-id">去中心化身分案例研究</a>中了解更多關於不丹 NDI 的資訊。
      </p>
 
</AlertDescription>
 
</AlertContent>
</Alert>

### 人類證明 {#proof-of-humanity}

當今最廣泛使用的零知識證明實際應用例子之一是 [World ID 協定](https://world.org/blog/world/world-id-faqs)，它可以被視為「AI 時代的全球數位護照」。它允許人們證明自己是獨特的個體，而無需揭露個人資訊。這是透過一種名為 Orb 的裝置來實現的，該裝置會掃描人的虹膜並產生虹膜代碼。虹膜代碼經過檢查和驗證，以確認該人是生物學上獨特的人類。驗證後，在使用者裝置上產生的身分承諾（不與生物辨識資料連結或從中衍生）會被新增到區塊鏈上的安全清單中。然後，每當使用者想要證明他們是經過驗證的人類時——無論是為了登入、投票還是採取其他行動——他們都可以產生一個零知識證明，確認他們在該清單中的成員身分。使用零知識證明的美妙之處在於只揭露了一個陳述：這個人是獨特的。其他一切都保持隱私。

World ID 依賴於以太坊基金會 [PSE 團隊](https://pse.dev/)開發的 [Semaphore 協定](https://docs.semaphore.pse.dev/)。Semaphore 被設計為一種輕量級但強大的方式來產生和驗證零知識證明。它讓使用者證明他們是某個群體（在這種情況下，是經過驗證的人類）的一部分，而無需顯示他們是群體中的哪個成員。Semaphore 也具有高度的靈活性，允許根據廣泛的標準（例如身分驗證、參與事件或擁有憑證）來建立群體。

### 驗證 {#authentication}

使用線上服務需要證明你的身分和存取這些平台的權利。這通常需要提供個人資訊，如姓名、電子郵件地址、出生日期等。你可能還需要記住長密碼，否則就有失去存取權限的風險。

然而，零知識證明可以簡化平台和使用者的驗證過程。一旦使用公共輸入（例如，證明使用者是平台成員的資料）和私密輸入（例如，使用者的詳細資訊）產生了零知識證明，使用者只需在需要存取服務時出示它來驗證其身分即可。這改善了使用者的體驗，並使組織免於儲存大量使用者資訊的需求。

### 可驗證計算 {#verifiable-computation}

可驗證計算是零知識技術用於改善區塊鏈設計的另一個應用。可驗證計算允許我們將計算外包給另一個實體，同時保持可驗證的結果。該實體提交結果以及驗證程式已正確執行的證明。

可驗證計算對於在不降低安全性的情況下**提高區塊鏈上的處理速度至關重要**。要理解這一點，需要了解以太坊擴容提案解決方案之間的差異。

[鏈上擴容解決方案](/developers/docs/scaling/#onchain-scaling)（例如分片）需要對區塊鏈的基礎層進行廣泛的修改。然而，這種方法非常複雜，實施中的錯誤可能會破壞以太坊的安全模型。

[鏈下擴容解決方案](/developers/docs/scaling/#offchain-scaling)不需要重新設計核心以太坊協定。相反，它們依賴外包計算模型來提高以太坊基礎層的吞吐量。

實際運作方式如下：

- 以太坊不處理每筆交易，而是將執行卸載到一條獨立的鏈上。

- 處理完交易後，另一條鏈將結果傳回，以應用於以太坊的狀態。

這裡的好處是，以太坊不必進行任何執行，只需要將外包計算的結果應用於其狀態。這減少了網路擁塞，也提高了交易速度（鏈下協定針對更快的執行進行了最佳化）。

該鏈需要一種方法來驗證鏈下交易而無需重新執行它們，否則鏈下執行的價值就會喪失。

這就是可驗證計算發揮作用的地方。當節點在以太坊之外執行交易時，它會提交一個零知識證明來證明鏈下執行的正確性。這個證明（稱為[有效性證明](/glossary/#validity-proof)）保證了交易是有效的，允許以太坊將結果應用於其狀態——而無需等待任何人提出爭議。

[零知識匯總 (ZK-rollup)](/developers/docs/scaling/zk-rollups) 和 [validium](/developers/docs/scaling/validium/) 是兩種使用有效性證明來提供安全可擴展性的鏈下擴容解決方案。這些協定在鏈下執行數千筆交易，並提交證明以在以太坊上進行驗證。一旦證明被驗證，這些結果就可以立即應用，允許以太坊處理更多交易，而不會增加基礎層的計算量。

除了第二層 (L2) 擴容之外，零知識證明還可以驗證以太坊 L1 區塊執行本身。[用於 L1 驗證的 zkEVM](/roadmap/zkevm/) 將允許驗證者透過檢查證明而不是重新執行所有交易來驗證區塊——從而在不提高驗證者硬體要求的情況下實現更高的燃料限制。

### 減少鏈上投票中的賄賂和共謀 {#secure-blockchain-voting}

區塊鏈投票方案具有許多有利的特徵：它們是完全可稽核的、能安全抵禦攻擊、抗審查，且不受地理限制。但即使是鏈上投票方案也無法免疫於**共謀**的問題。

共謀被定義為「透過欺騙、詐欺和誤導他人來協調限制公開競爭」，它可能採取惡意行為者透過提供賄賂來影響投票的形式。例如，Alice 可能會收到 Bob 的賄賂，在選票上投票給 `option B`，即使她更喜歡 `option A`。

賄賂和共謀限制了任何使用投票作為訊號機制的過程的有效性（特別是在使用者可以證明他們如何投票的情況下）。這可能會產生重大後果，特別是在投票負責分配稀缺資源的情況下。

例如，[二次方融資機制](https://www.radicalxchange.org/wiki/plural-funding/)依賴捐款來衡量不同公共財專案中對某些選項的偏好。每筆捐款都算作對特定專案的「投票」，獲得更多選票的專案將從配對池中獲得更多資金。

使用鏈上投票使二次方融資容易受到共謀的影響：區塊鏈交易是公開的，因此行賄者可以檢查受賄者的鏈上活動，看看他們是如何「投票」的。這樣一來，二次方融資就不再是根據社群的綜合偏好來分配資金的有效手段。

幸運的是，較新的解決方案（如 MACI，最小反共謀基礎設施）正在使用零知識證明，使鏈上投票（例如二次方融資機制）能夠抵抗賄賂和共謀。MACI 是一組智能合約和腳本，允許中央管理員（稱為「協調員」）匯總選票並計算結果，_而無需_揭露每個人如何投票的具體細節。即便如此，仍然可以驗證選票是否被正確計算，或確認特定個人參與了該輪投票。

#### MACI 如何與零知識證明一起運作？ {#how-maci-works-with-zk-proofs}

一開始，協調員在以太坊上部署 MACI 合約，之後使用者可以報名投票（透過在智能合約中註冊他們的公鑰）。使用者透過將使用其公鑰加密的訊息發送到智能合約來進行投票（除其他標準外，有效的投票必須使用與使用者身分關聯的最新公鑰進行簽署）。之後，一旦投票期結束，協調員會處理所有訊息，計算選票，並在鏈上驗證結果。

在 MACI 中，零知識證明用於確保計算的正確性，使協調員不可能錯誤地處理選票和計算結果。這是透過要求協調員產生零知識簡短非互動式知識論證 (ZK-SNARK) 證明來實現的，該證明驗證 a) 所有訊息都已正確處理 b) 最終結果對應於所有_有效_選票的總和。

因此，即使不分享每個使用者的投票明細（通常情況下是這樣），MACI 也能保證在計票過程中計算出的結果的完整性。此功能有助於降低基本共謀方案的有效性。我們可以使用前面 Bob 賄賂 Alice 投票給某個選項的例子來探討這種可能性：

- Alice 透過將她的公鑰發送到智能合約來註冊投票。
- Alice 同意投票給 `option B`，以換取 Bob 的賄賂。
- Alice 投票給 `option B`。
- Alice 秘密發送一筆加密交易，以更改與其身分關聯的公鑰。
- Alice 使用新公鑰向智能合約發送另一條（加密）訊息，投票給 `option A`。
- Alice 向 Bob 展示一筆交易，顯示她投票給了 `option B`（這是無效的，因為該公鑰在系統中不再與 Alice 的身分關聯）。
- 在處理訊息時，協調員會跳過 Alice 對 `option B` 的投票，只計算對 `option A` 的投票。因此，Bob 試圖與 Alice 共謀並操縱鏈上投票的企圖失敗了。

使用 MACI <em>確實</em>需要信任協調員不會與行賄者共謀，也不會試圖自己賄賂投票者。協調員可以解密使用者訊息（建立證明所必需的），因此他們可以準確地驗證每個人的投票方式。

但在協調員保持誠實的情況下，MACI 代表了一個強大的工具，可以保證鏈上投票的神聖性。這解釋了它在嚴重依賴每個人投票選擇完整性的二次方融資應用程式（例如 [clr.fund](https://clr.fund/#/about/maci)）中受歡迎的原因。

[了解更多關於 MACI 的資訊](https://maci.pse.dev/)。

## 零知識證明如何運作？ {#how-do-zero-knowledge-proofs-work}

零知識證明允許你證明陳述的真實性，而無需分享陳述的內容或揭露你是如何發現真相的。為了實現這一點，零知識協定依賴於將某些資料作為輸入並傳回「真」或「假」作為輸出的演算法。

零知識協定必須滿足以下標準：

1. **完整性**：如果輸入有效，零知識協定總是傳回「真」。因此，如果潛在的陳述為真，並且證明者和驗證者誠實行事，則證明可以被接受。

2. **健全性**：如果輸入無效，理論上不可能欺騙零知識協定傳回「真」。因此，說謊的證明者無法欺騙誠實的驗證者相信無效的陳述是有效的（除了一個極小的機率範圍）。

3. **零知識**：除了陳述的有效性或虛假性之外，驗證者對陳述一無所知（他們對陳述具有「零知識」）。此要求也防止驗證者從證明中推導出原始輸入（陳述的內容）。

在基本形式中，零知識證明由三個元素組成：**見證**、**挑戰**和**回應**。

- **見證**：透過零知識證明，證明者想要證明對某些隱藏資訊的知識。秘密資訊是證明的「見證」，而證明者對見證的假設知識建立了一組只能由了解該資訊的一方回答的問題。因此，證明者透過隨機選擇一個問題、計算答案並將其發送給驗證者來開始證明過程。

- **挑戰**：驗證者從該組問題中隨機挑選另一個問題，並要求證明者回答。

- **回應**：證明者接受問題，計算答案，並將其傳回給驗證者。證明者的回應允許驗證者檢查前者是否真的可以存取見證。為了確保證明者不是盲目猜測並碰巧得到正確答案，驗證者會挑選更多問題來詢問。透過多次重複這種互動，證明者偽造見證知識的可能性會顯著下降，直到驗證者滿意為止。

上述描述了「互動式零知識證明」的結構。早期的零知識協定使用互動式證明，其中驗證陳述的有效性需要證明者和驗證者之間來回通訊。

說明互動式證明如何運作的一個好例子是 Jean-Jacques Quisquater 著名的[阿里巴巴山洞故事](https://en.wikipedia.org/wiki/Zero-knowledge_proof#The_Ali_Baba_cave)。在故事中，Peggy（證明者）想向 Victor（驗證者）證明她知道打開魔法門的秘密咒語，而無需揭露該咒語。

### 非互動式零知識證明 {#non-interactive-zero-knowledge-proofs}

雖然具有革命性，但互動式證明的實用性有限，因為它需要雙方都在場並反覆互動。即使驗證者確信證明者的誠實，該證明也無法用於獨立驗證（計算新證明需要證明者和驗證者之間的一組新訊息）。

為了解決這個問題，Manuel Blum、Paul Feldman 和 Silvio Micali 提出了第一個[非互動式零知識證明](https://dl.acm.org/doi/10.1145/62212.62222)，其中證明者和驗證者擁有一個共享金鑰。這允許證明者展示他們對某些資訊（即見證）的知識，而無需提供資訊本身。

與互動式證明不同，非互動式證明只需要參與者（證明者和驗證者）之間進行一輪通訊。證明者將秘密資訊傳遞給一個特殊的演算法來計算零知識證明。這個證明被發送給驗證者，驗證者使用另一個演算法檢查證明者是否知道秘密資訊。

非互動式證明減少了證明者和驗證者之間的通訊，使零知識證明更有效率。此外，一旦產生了證明，任何其他人（只要能存取共享金鑰和驗證演算法）都可以對其進行驗證。

非互動式證明代表了零知識技術的突破，並刺激了當今使用的證明系統的發展。我們在下面討論這些證明類型：

### 零知識證明的類型 {#types-of-zero-knowledge-proofs}

#### ZK-SNARK {#zk-snarks}

ZK-SNARK 是**零知識簡短非互動式知識論證**的縮寫。ZK-SNARK 協定具有以下特質：

- **零知識**：驗證者可以驗證陳述的完整性，而無需了解關於該陳述的任何其他資訊。驗證者對該陳述的唯一知識是它是真還是假。

- **簡短**：零知識證明比見證小，並且可以快速驗證。

- **非互動式**：該證明是「非互動式」的，因為證明者和驗證者只互動一次，不像互動式證明需要多輪通訊。

- **論證**：該證明滿足「健全性」要求，因此作弊的可能性極低。

- **知識**：如果沒有存取秘密資訊（見證）的權限，就無法建構零知識證明。對於沒有見證的證明者來說，計算出有效的零知識證明即使不是不可能，也是非常困難的。

前面提到的「共享金鑰」是指證明者和驗證者同意在產生和驗證證明時使用的公共參數。產生公共參數（統稱為公共參考字串 (CRS)）是一項敏感的操作，因為它在協定安全性中具有重要性。如果用於產生 CRS 的熵（隨機性）落入不誠實的證明者手中，他們就可以計算出虛假的證明。

[多方計算 (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) 是一種降低產生公共參數風險的方法。多方參與[可信設置儀式](https://zkproof.org/2021/06/30/setup-ceremonies/amp/)，每個人貢獻一些隨機值來產生 CRS。只要有一方誠實地銷毀了他們那部分的熵，ZK-SNARK 協定就能保持計算上的健全性。

可信設置要求使用者信任參數產生中的參與者。然而，ZK-STARK 的發展已經實現了可以在非可信設置下運作的證明協定。

#### ZK-STARK {#zk-starks}

ZK-STARK 是**零知識可擴展透明知識論證**的縮寫。ZK-STARK 與 ZK-SNARK 類似，不同之處在於它們是：

- **可擴展**：當見證的大小較大時，ZK-STARK 在產生和驗證證明方面比 ZK-SNARK 更快。使用 STARK 證明，證明者和驗證時間只會隨著見證的增長而略微增加（SNARK 證明者和驗證者時間隨見證大小呈線性增加）。

- **透明**：ZK-STARK 依賴公開可驗證的隨機性來產生用於證明和驗證的公共參數，而不是可信設置。因此，與 ZK-SNARK 相比，它們更加透明。

ZK-STARK 產生的證明比 ZK-SNARK 大，這意味著它們通常具有更高的驗證開銷。然而，在某些情況下（例如證明大型資料集），ZK-STARK 可能比 ZK-SNARK 更具成本效益。

## 使用零知識證明的缺點 {#drawbacks-of-using-zero-knowledge-proofs}

### 硬體成本 {#hardware-costs}

產生零知識證明涉及非常複雜的計算，最好在專用機器上執行。由於這些機器很昂貴，普通人通常無法負擔。此外，想要使用零知識技術的應用程式必須將硬體成本考慮在內——這可能會增加終端使用者的成本。

### 證明驗證成本 {#proof-verification-costs}

驗證證明也需要複雜的計算，並增加了在應用程式中實施零知識技術的成本。這種成本在證明計算的背景下特別相關。例如，零知識匯總 (ZK-rollup) 在以太坊上驗證單個 ZK-SNARK 證明需要支付約 500,000 燃料，而 ZK-STARK 則需要更高的費用。

### 信任假設 {#trust-assumptions}

在 ZK-SNARK 中，公共參考字串（公共參數）產生一次，並可供希望參與零知識協定的各方重複使用。公共參數是透過可信設置儀式建立的，其中假設參與者是誠實的。

但使用者實際上無法評估參與者的誠實度，使用者必須相信開發者的話。ZK-STARK 沒有信任假設，因為用於產生字串的隨機性是公開可驗證的。同時，研究人員正在致力於 ZK-SNARK 的非可信設置，以提高證明機制的安全性。

### 量子計算威脅 {#quantum-computing-threats}

ZK-SNARK 使用橢圓曲線密碼學進行加密。雖然目前假設橢圓曲線離散對數問題是難以處理的，但量子電腦的發展可能會在未來打破這種安全模型。

ZK-STARK 被認為可以免疫量子計算的威脅，因為它的安全性僅依賴於抗碰撞雜湊函數。與橢圓曲線密碼學中使用的公私鑰配對不同，抗碰撞雜湊運算更難被量子計算演算法破解。

## 延伸閱讀 {#further-reading}

- [零知識證明用例概述](https://pse.dev/projects) — _隱私與擴容探索團隊 (Privacy and Scaling Explorations Team)_
- [SNARK vs. STARK vs. 遞迴 SNARK](https://www.alchemy.com/overviews/snarks-vs-starks) — _Alchemy 概述_
- [零知識證明：改善區塊鏈上的隱私](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_
- [zk-SNARK — 現實的零知識範例與深入探討](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_
- [ZK-STARK — 建立可驗證的信任，甚至對抗量子電腦](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_
- [關於 zk-SNARK 如何成為可能的近似介紹](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_
- [為什麼零知識證明 (ZKP) 是自主身分的遊戲規則改變者](https://frankiefab.hashnode.dev/why-zero-knowledge-proofs-zkps-is-a-game-changer-for-self-sovereign-identity) — _Franklin Ohaegbulam_
- [EIP-7503 解釋：使用零知識證明在以太坊上實現私密轉帳](https://web.archive.org/web/20251116093505/https://research.2077.xyz/eip-7503-zero-knowledge-wormholes-for-private-ethereum-transactions/) — _Emmanuel Awosika_
- [ZK 紙牌遊戲：學習零知識基礎知識和現實生活用例的遊戲](https://github.com/ZK-card/zk-cards) - _ZK-Cards_

<Divider />

<QuizWidget quizKey="zero-knowledge-proofs" />
