ZKP (Zero-Knowledge Proofs) 簡介

COSCUP 2021

08 / 01

1025 ~ 1055

 

講者: 王銘德

v1.0.0 

議程

  • 什麼是 ZKP?

  • ZKP 技術的發展現況

  • 如何學習使用 ZKP?

  • ZKP 可預見的未來

什麼是 ZKP?

我想用最少的數學, 最能讓大家理解的方法, 介紹什麼是 zkp

 

(這會非常困難, 非常大的挑戰, 但我只能盡力而為...)

我先不談 zkp, 我們先聊一個問題, "什麼是證明", 舉例來說:

你如果去 7-11 買香菸, 店員一定會問你 "你20歲了嗎?". 你想買到菸, 所以你一定會說 "我超過 20 歲了", 這是你的 statement (一個陳述), 但未必每個人都可以輕易的利用外表, 來證明你的年齡. 所以 一個最常用的方法 就是拿出你的身分證, 或護照之類的 ID (官方證明), 上面的出生日, 可以當成你的 witness (證據), 而這個方法, 就是你的  proof (證明,一個過程或內容).

 

zkp 裡的 p => proof

情境一, 我想說服店員:"我真的超過 20 歲了", 但我又不想讓店員知道我幾歲, 可能嗎?

 

在現今真實社會裡, 似乎不太可能辦到. 因為我們太依賴政府給我們建立的 trust (信任), 所以大家就直接 "相信" 政府單位給擔保的

1. 身分證 2. 健保卡 (也就是銀行, 或電信公司要求的 "雙證件")

(我如果有方法證明我超過 20 歲, 且又不讓店員知道我幾歲, 那就叫 zkp.)

 

zkp 裡的 zk => zero-knowledge

情境二, 先忘掉 zkp, 我們來玩一個遊戲 

 

  • Alice (Alice 沒有色盲), Bob (Bob 有紅綠色色盲)
  • Bob 手上拿了兩個撞球(沒有數字, 只有顏色), 一個紅色🔴, 一個綠色🟢 (但 Bob 無法分辨, 哪一個是紅色, 哪一個是綠色)
  • Alice, Bob 可以互動講話或傳訊息 (messages), 就是不能說哪一顆球是什麼顏色 (其實說了 Bob 也不一定會相信)
  • Alice 要如何證明, 或說服 Bob 相信 "兩顆球一定是不同顏色 這句話是真的 (true)"

 

可否想出一個方法, Alice 能讓 Bob 相信 “真的兩顆球一定不同顏色", 但未告知 Bob 兩顆球的顏色

情境二裡, 其實我還是在講 zkp 

 

zero-knowledge, 就是除了證明某個 "陳述" 是真的, 沒有透露其他任何訊息.

我們可以在沒有告知 Bob 哪一顆球是什麼色, Bob 又是 “紅綠色盲", 所以整個過程中, Bob 完全是 zero-knowledge (零知識)* (但我不喜歡 knowledge 翻譯成 "知識" *, 不如翻譯 “知道")

 

證明方法如下:

 

  • Bob 一手拿著一顆球,然後拿到背後隨機選擇交換或不交換. 再拿給 Alice 看, 問 Alice, 這次兩顆球有沒有交換過.
  • 可以重複多做幾次. Alice 如果瞎猜, 也不可能每次都猜對.
  • Bob 經過 Alice 多次 “誠實" 回答的驗證, 慢慢他會相信 "兩顆球不同顏色" 是真的... (這類的 proof system, 就叫 zk proof )

在情境二裡的這種 zkp 我們稱之為  Interactive Proof (互動式證明)

 

相反的, 有另一種叫 Non-Interactive (非互動式)

 

Alice 就叫證明方 (prover) , 而 Bob 叫驗證方 (verifier), 當雙方只有個一個人 interactive 的過程還好, 但如果 驗證方有成千上萬人(或電腦程式) 時, 互動式證明 就變得不可行. (以區塊鏈為例)

 

所以出現多種 非互動式 zk 證明(例如 NIZK, zk-SNARK, zk-STARK) SNARK 跟 STARK 都是基於多項式驗證的零知識技術。差別在於,如何隱藏資訊、如何簡潔地驗證、跟如何達到非互動性。)

其實所有的 Interactive zkp, 都可以改寫成 non-interactive zkp

 

簡單說, 就是找一個方法 (例如 Fiat-Shamir Heuristic 來作預先取樣) , 預先把所需的互動先挑好, Prover 也因此可以依據該互動內容把證明準備好, 一次丟給 Verifiers. (問題解決了) 但又衍伸出另外的問題, 通常這樣的證明, 資料量都很大. 當證明的內容更大時, 所要產生用來證明的資料量就更大. 因此需要發展出 non-interactive, 資料量又簡潔的 zkp 方法. (驗證只需幾個幾毫秒, proof 大小只有幾百個bytes)

 

舉例 zk-SNARK 裡的 S = Succinct (簡潔)

N = Non-interactive (非互動式) ARK(知識辯證)

動動腦時間

想想看 hash function (雜湊函示)是不是也可以用來當 zkp?

🤔

* 答案在最後一頁

SNARKs

 

O(N*log(N))

~O(1) 快

~O(1) 小

(低)

 

 

STARKs

 

O(N*poly-log(N))

O(ploy-log(N))

O(ploy-log(N)) 大

(高)

 

 

Bulletproofs

 

O(N*log(N))

O(N) 快

O(log(N)) 小

(高)

 

 

 

比較

 

proof 速度

verify 速度

proof size

擴充性

透明度(公開性)

需要 trusted setup

 

抗原子電腦

常見的幾種 zkp 做個比較(哪種比較好?)

需要特別介紹 R1CS

(Rank-1 Constraint Satisfiability)

zk-SNARK 採用 R1CS 的描述方式來表達原來的 多項式運算(參考)

(陳述 -> 運算 => R1CS => QAP 多項式 -> 證明 proof -> 驗證 verify )

 

  • 每一個 R1CS 用 A, B, C 矩陣來表示, 也就是一個 constraint, 一個 gate, 而且可以有一個 w 能滿足 w。c = w。a  w。b

(而這個*只能是 +,-,*,/ 所以運算有 **, 就不是一個 R1CS, 需要簡化)

  • 我們很難用低階語言來寫一個問題, (例如一個 sha256, 就有可能需要上萬個限制)
  • 所以我們可以用 circuit 語言來寫 "運算線路", (例如 circom, cairo, bellman)
  • 也有很多現成的大型線路, 可以直接套用 (例如 circomlib)
  • 可以搭配著 SNARK 程式庫使用, 例如 snarkjs, 或 Zokrates

什麼是 Powers of Tau?

二階段可信配置 "trusted setup", 的第一階段

利用多方運算技術 multi-party computation (MPC)

來產生安全的 zk-SNARK 參數 (參考資料)

 

舉例一.  zk-Rollup - 有 260 million 限制; 所以必須使用 2**28 powers of tau.

 

以我的測試為例, 使用 circomlib 裡的 sha256 線路需要

59051 限制, 我用 pot12_0003.ptau

[ERROR] snarkJS: circuit too big for this power of tau ceremony. 59051*2 (118102) > 2**12 (4096) 

 

2**17 (131702) 才夠

[ERROR]

ZKP 技術的發展現況

  • 開發工具逐漸成熟, 能帶動更多的 zkp 的實作與驗證

 

  • https://zkp.science/ 裡可以找到各種語言用的 zkp 程式庫, 以及 circuit 的開發工具

各家公司 zkp 技術的再提升

以 zCash 為例, 自從 2016 年開始運作以來, 就換了好幾種不同的 zk-SNARK: 從 BCTV14, Sprout, 到現在的 dubbed Sapling 已經做到平行化批次處理 (來增加交易量), 今年底 Halo Arc 將改不需要 trusted setup.

例如 IPFS 的 Filecoin, bellperson (來自於bellman) 已經開始用 GPU 加速處理, 每天可以產生 6~7 百萬個 proofs.

zCash

FileCoin

zkp 技術應用層面更廣

平台 OS, VM, 硬體, IoT (snarkOS)

應用軟體 DApps -> ZApps

Layer 2 區塊鏈 (ZK-Rollups, Aztec)

Layer 1 區塊鏈 (zCash, Ethereum POS, Aleo, IronFish, Mina)

Tokens 層 (zkAssets)

SDK, 工具 (iden3, matter-labs, Zokrates, O(1)-labs)

如何學習使用 ZKP?

zkp 技術的開發環境

(以 zk-SNARK 為例)

我建議初學者可以先從 snarkjs + circom (iden3.io) 開始學起

*先練習簡單線路, 且用 Solidity 來實作, 再利用 zkpoker 問題來練習

 

$ snarkjs zkey export solidityverifier circuit_final.zkey verifier.sol

(用 remix 來部署 verfier.sol)

$ snarkjs generatecall (產生測試所需的參數)

 

* 或使用 ZoKrates (功能類似)

ZKP 可預見的未來

  • 越來越多的 ZK 語言會出現

  • DApps 開始會加入 ZKP 元素, 來隱藏交易與個資的內容(例如 NFT, Gaming, data 保存, 身分認證, 財力證明, 與登錄與授權等)

  • 會有更多人用 GPU 來加速 zkp 產生證明, 因為需要做 FFT...

  • Proofs Aggregation, 上千個 proofs, 壓縮成一個 proof 的技術, 會漸漸成熟

  • 更多區塊鏈, 將採用 zkp 技術, 解決交易的隱密問題. (且保持快速的交易, 以及低廉的 gas fee)

  • zkp 會被應用到更多領域, 例如數位金融, 認證系統, 社交軟體等...

Q & A

王銘德

mingderwang@gmail.com

* 答案在下一頁. ->>>>

動動腦時間(答案是)

想想看 hash function (雜湊函示)是不是也可以用來當 zkp?

🤩 yes or no

hash functions 不能直接當 zkp 用, 但可以當成線路 (circuit) 或線路的一部分, 來產生證明

(舉例, 我可以證明我知道你的 "名字", 我只要把你名字的 sha256 值給你, 就可以證明我真的知道, 但我可以不說出 你的 "名字")

ZKP

By ming

ZKP

  • 277