08 / 01
10:25 ~ 10:55
v1.0.0
(這會非常困難, 非常大的挑戰, 但我只能盡力而為...)
我先不談 zkp, 我們先聊一個問題, "什麼是證明", 舉例來說:
你如果去 7-11 買香菸, 店員一定會問你 "你20歲了嗎?". 你想買到菸, 所以你一定會說 "我超過 20 歲了", 這是你的 statement (一個陳述), 但未必每個人都可以輕易的利用外表, 來證明你的年齡. 所以 一個最常用的方法 就是拿出你的身分證, 或護照之類的 ID (官方證明), 上面的出生日, 可以當成你的 witness (證據), 而這個方法, 就是你的 proof (證明,一個過程或內容).
在現今真實社會裡, 似乎不太可能辦到. 因為我們太依賴政府給我們建立的 trust (信任), 所以大家就直接 "相信" 政府單位給擔保的
1. 身分證 2. 健保卡 (也就是銀行, 或電信公司要求的 "雙證件")
(我如果有方法證明我超過 20 歲, 且又不讓店員知道我幾歲, 那就叫 zkp.)
zero-knowledge, 就是除了證明某個 "陳述" 是真的, 沒有透露其他任何訊息.
我們可以在沒有告知 Bob 哪一顆球是什麼色, Bob 又是 “紅綠色盲", 所以整個過程中, Bob 完全是 zero-knowledge (零知識)* (但我不喜歡 knowledge 翻譯成 "知識" *, 不如翻譯 “知道")
相反的, 有另一種叫 Non-Interactive (非互動式)
Alice 就叫證明方 (prover) , 而 Bob 叫驗證方 (verifier), 當雙方只有個一個人 interactive 的過程還好, 但如果 驗證方有成千上萬人(或電腦程式) 時, 互動式證明 就變得不可行. (以區塊鏈為例)
簡單說, 就是找一個方法 (例如 Fiat-Shamir Heuristic 來作預先取樣) , 預先把所需的互動先挑好, Prover 也因此可以依據該互動內容把證明準備好, 一次丟給 Verifiers. (問題解決了) 但又衍伸出另外的問題, 通常這樣的證明, 資料量都很大. 當證明的內容更大時, 所要產生用來證明的資料量就更大. 因此需要發展出 non-interactive, 資料量又簡潔的 zkp 方法. (驗證只需幾個幾毫秒, proof 大小只有幾百個bytes)
🤔
* 答案在最後一頁
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
抗原子電腦
zk-SNARK 採用 R1CS 的描述方式來表達原來的 多項式運算(參考)
(陳述 -> 運算 => R1CS => QAP 多項式 -> 證明 proof -> 驗證 verify )
(而這個*只能是 +,-,*,/ 所以運算有 **, 就不是一個 R1CS, 需要簡化)
二階段可信配置 "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]
以 zCash 為例, 自從 2016 年開始運作以來, 就換了好幾種不同的 zk-SNARK: 從 BCTV14, Sprout, 到現在的 dubbed Sapling 已經做到平行化批次處理 (來增加交易量), 今年底 Halo Arc 將改不需要 trusted setup.
例如 IPFS 的 Filecoin, bellperson (來自於bellman) 已經開始用 GPU 加速處理, 每天可以產生 6~7 百萬個 proofs.
zCash
FileCoin
mingderwang@gmail.com
* 答案在下一頁. ->>>>
🤩 yes or no
hash functions 不能直接當 zkp 用, 但可以當成線路 (circuit) 或線路的一部分, 來產生證明
(舉例, 我可以證明我知道你的 "名字", 我只要把你名字的 sha256 值給你, 就可以證明我真的知道, 但我可以不說出 你的 "名字")