ZKP (Zero-Knowledge Proofs) 簡介
COSCUP 2021
08 / 01
10:25 ~ 10:55
講者: 王銘德
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, 需要簡化)
什麼是 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 技術的再提升
以 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) 開始學起
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