零知識證明(Zero-Knowledge Proof, ZKP)讓一方能向另一方證明「某件事為真」,卻不洩漏任何用來證明的細節。最經典的比喻是:你要向朋友證明你知道一扇環形密門的通關密語,你走進去、從另一邊繞出來,朋友確認你辦到了,但整個過程你一個字的密語都沒說出口。搬到區塊鏈上,這個原語讓你能證明「我有足夠餘額可以轉帳」或「這一批交易全部合法執行」,而不必公開你的餘額,或不必讓驗證者重跑一次全部運算。

今天聚焦的不是 rollup 誰快誰便宜的擴容比較,而是底層那顆密碼學引擎本身:zk-SNARK 與 zk-STARK。它們都能產生「簡短、可快速驗證」的證明,但在信任假設、透明性、量子抗性與證明大小上做了截然不同的取捨。搞懂這兩者的原理差異,你才會明白為什麼有人選 SNARK 做隱私幣、有人選 STARK 做 Layer 2,以及為什麼「量子電腦來了誰會先倒」是個真問題。

📖 學(核心)

零知識證明到底在證什麼:三個要件與「簡潔性」

零知識證明必須同時滿足三個性質:完整性(Completeness,真的敘述一定能被證明通過)、健全性(Soundness,假的敘述幾乎不可能騙過驗證者)、零知識性(Zero-Knowledge,驗證者除了「這是真的」以外學不到任何額外資訊)。少了任何一個都不成立:沒有健全性,證明就能造假;沒有零知識性,那就只是普通的公開驗算。

真正讓 ZKP 在區塊鏈爆紅的,是 SNARK 與 STARK 名字裡都有的那個「S」——Succinct,簡潔性。它的意思是:不管你要證明的運算有多龐大(跑了一百萬步還是一億步),最終產生的證明都很小、驗證起來都很快。這正是擴容的關鍵——驗證者(例如以太坊主網)不需要重跑整段運算,只要花極少的成本檢查一張「收據」。要做到這件事,你不能把任意程式直接丟進去,而是要先把運算「算術化」(arithmetization):把程式攤平成一連串 x = y (op) z 的簡單約束,再轉成多項式。SNARK 走的是二次算術程式(QAP)這條路,STARK 走的是執行軌跡(execution trace)加代數約束這條路。兩者的共通哲學是:把「這段運算被正確執行了」這件事,翻譯成「這組多項式滿足某些等式」這件數學事實,然後只需證明關於多項式的少數幾個點。

zk-SNARK:靠橢圓曲線配對,代價是「可信設定」

zk-SNARK(Succinct Non-interactive Argument of Knowledge)的核心武器是橢圓曲線配對(elliptic curve pairing)與多項式承諾。Vitalik 那篇經典的〈Quadratic Arithmetic Programs: from Zero to Hero〉把流程講得很清楚:先把計算攤平成邏輯閘、轉成 R1CS 約束、再編碼成 QAP 多項式,最後用橢圓曲線上的配對運算,讓驗證者只需檢查幾個群元素就能確認整個多項式關係成立。它的最大優點是證明極小(常見的 Groth16 只有幾百位元組)、驗證極快,這對於要把證明貼上鏈、每個位元組都要付 gas 的場景非常友善。

代價藏在「Non-interactive」背後:多數 SNARK 需要一次可信設定(trusted setup),產生一組公共參數。設定過程會生出一份「有毒廢料」(toxic waste)——如果有人保留了這串隨機數,他就能偽造出以假亂真的證明。因此像 Zcash 這類專案必須辦一場多人參與的「儀式」(ceremony),只要有一個參與者誠實銷毀自己那份秘密,整個系統就安全;但這個信任假設本身,就是 STARK 想徹底消滅的東西。此外,SNARK 的安全性建立在橢圓曲線的離散對數難題上——而這正是量子電腦最擅長攻破的問題。

zk-STARK:透明、抗量子,代價是證明比較大

zk-STARK(Scalable Transparent Argument of Knowledge)最關鍵的兩個字是 Transparent(透明)。它完全不需要可信設定,所有隨機性都來自公開可驗證的來源(把互動式協定用雜湊函數「Fiat-Shamir」轉成非互動),因此沒有任何有毒廢料、沒有需要信任的儀式主辦方。這對追求去中心化與長期可審計的系統是巨大優勢——你不必相信「當年有人真的把秘密燒掉了」。

STARK 的底層引擎是 FRI(Fast Reed-Solomon Interactive Oracle Proof of Proximity),一種「低次測試」:證明者要說服驗證者「我承諾的這組值,確實落在一個低次多項式上」。整個構造只依賴抗碰撞雜湊函數(如 SHA 系列)與 Merkle tree,而雜湊函數目前被認為具有量子抗性——量子電腦頂多把雜湊的暴力破解難度開根號(Grover 演算法),加大輸出長度就能補回來,不像離散對數會被 Shor 演算法直接秒殺。這讓 STARK 成為目前唯一有清楚「後量子安全故事」的主流證明系統。取捨在於:STARK 的證明尺寸明顯比 SNARK 大(可達數十至上百 KB),驗證成本也較高;StarkWare 為此發展了 ZK 友善的 Cairo 語言與 Starknet,並在 2024 年後持續用 Stwo 等新一代 prover 壓縮成本。

兩條路的應用分工:隱私靠 SNARK 起家,zkEVM 兩派並存

在隱私應用上,SNARK 因為證明小、上鏈便宜而先發制人。Zcash 用 zk-SNARK 實現遮蔽交易(shielded transaction),讓你能證明「這筆轉帳的輸入等於輸出、我有權花這些幣」,卻不公開發送方、接收方與金額。這類「證明餘額足夠卻不揭露餘額」的需求,正是 ZKP 三要件裡「零知識性」的直接商業化。近年混合幣、隱私支付與 KYC 憑證(證明你已滿 18 歲卻不透露生日)也大量沿用這套思路。

在 zkEVM(用 ZK 證明來驗證以太坊虛擬機執行結果)這條主戰場上,則是兩派並存。SNARK 陣營(如 Polygon zkEVM、Scroll、zkSync 早期)看中證明小、上鏈 gas 低;STARK 陣營(Starknet、以及把 STARK 證明再包一層 SNARK 來壓小的「遞迴」方案)看中透明無需設定與量子抗性。值得注意的是「遞迴證明」(recursive proof)這個近年關鍵手法:先用 STARK 高效地證明大量運算,再用 SNARK 把那張 STARK 證明壓成一張迷你證明貼上鏈,等於同時吃到 STARK 的透明性與 SNARK 的低驗證成本——這也是為什麼「SNARK vs STARK」在工程實務上愈來愈不是二選一,而是分層組合。

🧠 記

  • 零知識證明三要件:完整性、健全性、零知識性,缺一不可。
  • SNARK/STARK 名字裡的「S」都是 Succinct(簡潔):運算再大,證明都小、驗證都快。
  • SNARK 靠橢圓曲線配對,證明最小、驗證最快,但多數需要「可信設定」且有有毒廢料風險。
  • STARK 靠雜湊函數與 FRI 低次測試,透明無需設定、具量子抗性,但證明尺寸較大。
  • 量子威脅的關鍵:SNARK 依賴的離散對數會被 Shor 演算法攻破;STARK 依賴的雜湊只被 Grover 開根號,可補救。
  • 隱私應用(如 Zcash 遮蔽交易)因證明小,SNARK 先發;zkEVM 則 SNARK 與 STARK 兩派並存。
  • 遞迴證明:用 STARK 證大量運算、再用 SNARK 壓小上鏈,把兩者優點疊在一起。

✍️ 實踐

  1. 用一句話寫下 ZKP 三要件,再各舉一個「若缺少它會出什麼包」的例子,確認你真的分得清健全性與零知識性。
  2. 打開 StarkWare 的 STARK 101 教學,跟著把「執行軌跡 → 代數約束 → FRI 承諾」走過一遍(不必看懂全部數學,先建立流程直覺)。
  3. 讀 Vitalik 的 QAP 文章前三段,親手把一段簡單運算(例如 x^3 + x + 5 = 35)「攤平」成邏輯閘,體會 arithmetization 在做什麼。
  4. 找一個你用過的鏈或 L2,查它用的是 SNARK 還是 STARK、有沒有做過可信設定儀式,並記下該選擇對「量子抗性」的意涵。
  5. 挑一個現實需求(如「證明我年滿 18 歲卻不透露生日」),用零知識三要件描述它該證什麼、該隱藏什麼。

🔗 延伸學習


💬 問 AI

我想更深入理解零知識證明的密碼學原理。請以繁體中文(台灣用語)為我做以下三件事:

1. 用「多項式承諾」這個概念,分別解釋 zk-SNARK 的橢圓曲線配對路線,和 zk-STARK 的 FRI 低次測試路線,差別在哪。
2. 針對我的情境:我要做一個{請填入應用,例如:隱私支付 / zkEVM Layer 2 / 鏈上身分憑證},而我最在意的取捨是{請填入:證明大小上鏈成本 / 免可信設定的去中心化 / 量子抗性 / 證明時間},請幫我判斷該選 SNARK、STARK 還是遞迴組合,並說明理由。
3. 出 3 題由淺到深的問答題(附解答),幫我檢驗自己是否真的懂了「可信設定」與「量子抗性」這兩個概念。