Bulleproofs 算法有兩個方面的應用,
一個是 Range proof:
第一講: 理解零知識證明算法之Bulletproofs –Range Proof 1
第二講: 理解零知識證明算法之Bulletproofs –Range Proof 2
第三講: 理解零知識證明算法之Bulletproofs –Range Proof 3
另一個是 general arithmetic circuits,本編文章就來主要分享 Bulletproofs 在后者上的應用,
Arithmetic Circuits
了解 ZK-SNARK 算法應該都知道算術環路的概念,下面一張圖展示了 zk-snark 算法中,算術環路的設計規則(以 V 神的 x3 + x + 5 = 37為例)。
Circuit 設計規則:
1.由乘法門和加法門組成,每個門固定兩個輸入一個輸出;
2.不標記通過加法門連接乘法門的線,如圖中綠線,僅起到連接作用;
3.同一條線直接或間接連接多個乘法門,僅表示為一條有效的線,為了方便理解,用紫色虛線表示其連接關系;
4.MulGate 處的取值為圖中紅色字體所示
5.黃色線條為有效連接線
6.橙色線條表示 MulGate 對應的一階約束
那Bulletproofs算法的算術環路的設計規則是什么樣的呢?我們看看下圖(仍以 V 神的x3 + x + 5 = 37為例)。
Circuit 設計規則:
1.由乘法門和加法門組成,每個門固定兩個輸入一個輸出;
2.不標記加法門
3.不標記有常量的乘法門
4.紅色字體表示乘法門的索引
5.黃色字體表示乘法門的輸入和輸出
6.橙色線條表示乘法門對應的一階約束
7.藍色線條表示相鄰乘法門間的一致性約束
因此,一個完整有效的算數電路應該滿足:
1.每個乘法門對應的的約束成立
2.乘法門之間的一致性約束成立
Zk-snark 的算術電路通過 R1CS 滿足了上述兩個條件。
1.每個 R1CS 表示一個乘法門的約束
2.相鄰乘法門的輸出是下一個乘法門的輸入,如圖中的 y,sym_1,sym_2
Bulletproofs 的算術環路以通過以下兩種方式滿足上述兩個條件:
1.每個乘法門對應的約束成立
2.上個乘法門的輸出等于下個乘法門的輸入,
看起來兩個算法的證明一個算術電路有效的思想是一樣,但是由于兩個電路的標注規則不同,就產生兩個不同的約束結果。
Zk-snark 算法以 valid wires 為基本要素,每個 wire 有左輸入,右輸入,和輸出三個屬性
Bulletproofs 算法以 valid Mulgate 為基本要素,每個 Mulgate 有左輸入,右輸入和輸出三個屬性
最后,附上一張對比圖:
總結 以上可以看出,對數算術環路的滿足性問題,不同的算法具有不同的電路描述方式, Zk-snark 算法由 Circuits 轉化到 QAP,最終生成的證據僅僅再幾十個字節大小;
Bulletproofs 的算法由 Circuits 轉化到 inner productor,生成的證明的大小和算術電路的乘法門的個數 n 有關 O(log(n*Q ),電路越大,證據越大,
附錄
1.Bulletproofs 論文:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8418611
2.BCG+ 講述了算術電路的另外一種描述形式 https://eprint.iacr.org/2017/1066.pdf