主頁
微信公眾號:密碼應用技術實戰
部落格園首頁:https://www.cnblogs.com/informatics/
GIT地址:https://github.com/warm3snow
簡介
Bulletproof將範圍證明轉換為二次多項式表達\(t(X) = t_0 + t_1 \cdot X + t_2 \cdot X^2\),並透過多項式承諾和內積承諾的驗證,完成了範圍證明。回顧《Bulletproof範圍證明之原理》,我們詳細介紹了Bulletproof範圍證明的構造和驗證流程。本文將進一步介紹Bulletproof範圍證明的最佳化技術 - 折半演算法
本文組織如下:
- 術語定義
- Bulletproof複雜度分析
- Bulletproof折半演算法
- 總結
- 參考文獻
術語定義
- \(p\)和\(q\):分別表示兩個大素數
- \(Z_p\):表示模\(p\)的整數環
- \(Z_p^*\):表示模\(p\)的整數環中的所有與\(p\)互素的元素, 即非零元素
- \(G\):階為\(p\)的迴圈群, 如果:\(g \in G, G = \{1, g, g^2, ..., g^{p-1}\} \equiv Z_p\), 則\(g\)是\(G\)的生成元
- \(G^n\)和\(Z_p^n\):分別表示群\(G\)上的n維向量空間和\(Z_p\)上的n維向量空間
- \(h^r \mathbf{g}^{\mathbf{x}}\) = \(h^r \cdot \prod_{i=1}^{n} g_i^{x_i} = h^r \cdot g_1^{x_1} \cdot g_2^{x_2} \cdot ... \cdot g_n^{x_n}\): 表示向量\(\mathbf{x}\)的Pedersen承諾值
- \(\mathbf{g}^{\mathbf{a}}{\mathbf{h}}^{\mathbf{b}} = \prod_{i=1}^{n} g_i^{a_i} \cdot h_i^{b_i}\): 表示向量\(\mathbf{a}\)和\(\mathbf{b}\)的Pedersen承諾值
- \(\langle \mathbf{a}, \mathbf{b} \rangle = \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i \cdot b_i\): 表示向量\(\mathbf{a}\)和\(\mathbf{b}\)的內積。
- \(\mathbf{a} \circ \mathbf{b} = (a_1 \cdot b_1, a_2 \cdot b_2, ..., a_n \cdot b_n)\): 表示向量\(\mathbf{a}\)和\(\mathbf{b}\)的哈達瑪積。
- \(\mathbf{a_{[:n']}} = (a_1, a_2, ..., a_{n'}) \in F^{n'}\) 和 \(\mathbf{a_{[n':]}} = (a_{n'+1}, a_{n'+2}, ..., a_n) \in F^{n-n'}\): 表示向量\(\mathbf{a}\)的前\(n'\)個元素和後\(n-n'\)個元素。
- \(P\)和\(V\): 分別表示證明生成者Prover和證明驗證者Verifier
Bulletproof複雜度分析
在上一篇文章《Bulletproof範圍證明之原理》中,我們介紹了Bulletproof向量內積證明,Bulletproof使用向量內積證明來進行範圍證明,流程如下:
分析上圖中的通訊資料包可以發現,互動式Bulletproof向量內積證明過程中,Prover和Verifier需要傳送的資料包包括:
- 承諾\(C = (V, A, S, T_1, T_2)\), 其中\(V, A, S, T_1, T_2 \in G\), 複雜度為\(O(1)\)
- Verifier需要傳送的資料包括:挑戰\((x, y, z)\), 其中\(x, y, z \in Z_p^*\), 複雜度為\(O(1)\)
- 響應\((\tau_x, \mu, t, \mathbf{l}, \mathbf{r})\), 其中\(\tau_x, \mu, t \in Z_p\), \(\mathbf{l}, \mathbf{r} \in Z_p^n\), 複雜度為\(O(2n)\)
綜上,未最佳化版本的Bulletproof向量內積證明通訊複雜度為\(O(2n)\)。複雜度主要來自於Prover傳送的響應\((\mathbf{l}, \mathbf{r})\),其中\(\mathbf{l}\)和\(\mathbf{r}\)是長度為\(n\)的向量。
Bulletproof折半演算法
Bulletproof折半演算法是Bulletproof的一種最佳化技木,主要用於減少Bulletproof範圍證明的通訊複雜度,並實現了\(O(2\log_2{n})\)的通訊複雜度。Bulletproof折半演算法的核心思想是透過遞迴的方式,不斷將向量\(\mathbf{l}\)和\(\mathbf{r}\)折半,直到兩個向量長度都為1,最終傳送\(O(2\log_2{n})\)個長度為1的資料包,從而實現了資料的壓縮。
折半演算法
Bulletproof折半演算法基於改進的向量內積證明,下面我們將詳細介紹Bulletproof折半演算法的最佳化原理。
改進的向量內積
假設\(\mathbf{g}\)和\(\mathbf{h}\)是兩個獨立的\(G\)生成元,標量\(c \in Z_p\),並有\(P \in G\),向量內積證明的目標是Prover向Verifier證明自己知道向量\(\mathbf{a}, \mathbf{b} \in Z_p^n\), 滿足以下關係:
\[P = {\mathbf{g}}^{\mathbf{a}}{\mathbf{h}}^{\mathbf{b}} \quad and \quad c = \langle \mathbf{a}, \mathbf{b} \rangle
\]
其中:
- \(P\)是\(\mathbf{a}, \mathbf{b}\)的向量Pedersen承諾。
- \(c\)表示\(\mathbf{a}, \mathbf{b}\)的向量內積
以上的向量關係可以轉換為下面的證明系統:
\[\{(\mathbf{g},\mathbf{h} \in G^n, P \in G, c \in Z_p; \mathbf{a}, \mathbf{b} \in Z_p^n): P = {\mathbf{g}}^{\mathbf{a}}{\mathbf{h}}^{\mathbf{b}} \land c = \langle \mathbf{a}, \mathbf{b} \rangle \}
\]
在上述證明系統中:
- Prover可以直接將\(\mathbf{a}, \mathbf{b} \in Z_p^n\)傳送給Verifier, Verifier重新計算\(P\)並檢查是否正確,這種承諾的明文開啟和驗證方式顯然是可以的。
- Prover需要向Verifier傳送\(2n\)個元素。
在Bulletproof中,將以上證明系統轉換為以下等價的證明系統:
\[\{(\mathbf{g},\mathbf{h} \in G^n, u, P \in G, c \in Z_p; \mathbf{a}, \mathbf{b} \in Z_p^n): P = {\mathbf{g}}^{\mathbf{a}}{\mathbf{h}}^{\mathbf{b}} \cdot u^{\langle \mathbf{a}, \mathbf{b} \rangle} \}
\]
其中\(u\)是\(G\)的獨立且公開的生成元。
折半演算法
H函式
在Bulletproof折半演算法中,引入了一個特殊的功能函式\(H: Z_p^{2n+1} \rightarrow G\)
\[H(\mathbf{w}, \mathbf{x}, \mathbf{y}, \mathbf{z}, c) = {\mathbf{g}}_{[:n']}^{\mathbf{w}} \cdot {\mathbf{g}}_{[n':]}^{\mathbf{x}} \cdot {\mathbf{h}}_{[:n']}^{\mathbf{y}} \cdot {\mathbf{h}}_{[n':]}^{\mathbf{z}} \cdot u^c \in G
\]
其中:
- \(n' = n/2\), 即\({\mathbf{g}}_{[:n']}\)表示向量\(\mathbf{g}\)的前\(n/2\)個元素,\({\mathbf{g}}_{[n':]}\)表示向量\(\mathbf{g}\)的後\(n/2\)個元素。\({\mathbf{h}}_{[:n']}, {\mathbf{h}}_{[n':]}\)同理
- 輸入引數為五元組\(\{\mathbf{w}, \mathbf{x}, \mathbf{y}, \mathbf{z} \in Z_p^{n'}, c \in Z_p \}\)
- 輸出為群\(G\)中的元素
上述\(H\)函式有一個重要性質: 加法同態。即:
\[H(\mathbf{w1}, \mathbf{x1}, \mathbf{y1}, \mathbf{z1}, c1) \cdot H(\mathbf{w2}, \mathbf{x2}, \mathbf{y2}, \mathbf{z2}, c2) = H(\mathbf{w1 + w2}, \mathbf{x1 + x2}, \mathbf{y1 + y2}, \mathbf{z1 + z2}, c1 + c2)
\]
同態性證明:
\[H(\mathbf{w1}, \mathbf{x1}, \mathbf{y1}, \mathbf{z1}, c1) \cdot H(\mathbf{w2}, \mathbf{x2}, \mathbf{y2}, \mathbf{z2}, c2)
\]
\[= {\mathbf{g}}_{[:n']}^{\mathbf{w1}} \cdot {\mathbf{g}}_{[n':]}^{\mathbf{x1}} \cdot {\mathbf{h}}_{[:n']}^{\mathbf{y1}} \cdot {\mathbf{h}}_{[n':]}^{\mathbf{z1}} \cdot u^{c1} \cdot {\mathbf{g}}_{[:n']}^{\mathbf{w2}} \cdot {\mathbf{g}}_{[n':]}^{\mathbf{x2}} \cdot {\mathbf{h}}_{[:n']}^{\mathbf{y2}} \cdot {\mathbf{h}}_{[n':]}^{\mathbf{z2}} \cdot u^{c2}
\]
\[= {\mathbf{g}}_{[:n']}^{\mathbf{w1} + \mathbf{w2}} \cdot {\mathbf{g}}_{[n':]}^{\mathbf{x1} + \mathbf{x2}} \cdot {\mathbf{h}}_{[:n']}^{\mathbf{y1} + \mathbf{y2}} \cdot {\mathbf{h}}_{[n':]}^{\mathbf{z1} + \mathbf{z2}} \cdot u^{c1 + c2}
\]
\[= H(\mathbf{w1 + w2}, \mathbf{x1 + x2}, \mathbf{y1 + y2}, \mathbf{z1 + z2}, c1 + c2)
\]
等價轉換
按照\(H\)函式的定義,我們可以將證明系統中的\(P\)重寫為:
\[P = {\mathbf{g}}^{\mathbf{a}}{\mathbf{h}}^{\mathbf{b}} \cdot u^{\langle \mathbf{a}, \mathbf{b} \rangle} = H(\mathbf{a_{[:n']}}, \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}, \mathbf{b_{[n':]}, \langle \mathbf{a}, \mathbf{b} \rangle} }) \in G
\]
等式證明:
\[P = {\mathbf{g}}^{\mathbf{a}}{\mathbf{h}}^{\mathbf{b}} \cdot u^{\langle \mathbf{a}, \mathbf{b} \rangle} = \prod g_i^{a_i} \cdot \prod h_i^{b_i} \cdot u^{\langle \mathbf{a}, \mathbf{b} \rangle}
\]
\[= \prod_{i=1}^{n'} g_i^{a_i} \cdot \prod_{i=n'+1}^{n} g_i^{a_i} \cdot \prod_{i=1}^{n'} h_i^{b_i} \cdot \prod_{i=n'+1}^{n} h_i^{b_i} \cdot u^{\langle \mathbf{a}, \mathbf{b} \rangle}
\]
\[= {\mathbf{g}}_{[:n']}^{\mathbf{a_{[:n']}}} \cdot {\mathbf{g}}_{[n':]}^{\mathbf{a_{[n':]}}} \cdot {\mathbf{h}}_{[:n']}^{\mathbf{b_{[:n']}}} \cdot {\mathbf{h}}_{[n':]}^\mathbf{b_{[n':]}} \cdot u^{\langle \mathbf{a}, \mathbf{b} \rangle}
\]
\[= H(\mathbf{a_{[:n']}}, \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}, \mathbf{b_{[n':]}, \langle \mathbf{a}, \mathbf{b} \rangle} }) \in G
\]
折半演算法構造
Bulletproof折半演算法的構造流程如下:
- Prover計算\(L, R \in G\), 併傳送給Verifier
\[L = H(\mathbf{0}^{n'}, \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}},\mathbf{0}^{n'}, \langle \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}} \rangle)
\]
\[= {\mathbf{g}}_{[:n']}^{\mathbf{0}^{n'}} \cdot {\mathbf{g}}_{[n':]}^{\mathbf{a_{[:n']}}} \cdot {\mathbf{h}}_{[:n']}^{\mathbf{b_{[:n']}}} \cdot {\mathbf{h}}_{[n':]}^{\mathbf{0}^{n'}} \cdot u^{\langle \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}} \rangle}
\]
\[R = H(\mathbf{a_{[n':]}}, \mathbf{0}^{n'}, \mathbf{0}^{n'}, \mathbf{b_{[:n']}}, \langle \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}} \rangle)
\]
\[= {\mathbf{g}}_{[:n']}^{\mathbf{a_{[n']}}} \cdot {\mathbf{g}}_{[n':]}^{\mathbf{0}^{n'}} \cdot {\mathbf{h}}_{[:n']}^{\mathbf{0}^{n'}} \cdot {\mathbf{h}}_{[n':]}^{\mathbf{b_{[:n']}}}\cdot u^{\langle \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}} \rangle}
\]
- Verifier選擇隨機挑戰\(x \in Z_p\), 併傳送給Prover
- Prover計算\(\mathbf{a'}, \mathbf{b'} \in Z_p^{n'}\), 併傳送給Verifier
\[\mathbf{a'} = x\mathbf{a_{[:n']}} + x^{-1}\mathbb{a_{[n':]}} \in Z_p^{n'}
\]
\[\mathbf{b'} = x^{-1}\mathbf{b_{[:n']}} + x\mathbf{b_{[n':]}} \in Z_p^{n'}
\]
- 基於\(L, R, \mathbf{a'}, \mathbf{b'}\), Verifier驗證以下等式是否成立:
\[L^{x^2} \cdot P \cdot R^{x^{-2}} \stackrel{?}{=} H(x^{-1}\mathbf{a'}, x\mathbf{a'}, x^\mathbf{b'}, x^{-1}\mathbf{b'}, \langle \mathbf{a'}, \mathbf{b'} \rangle)
\]
- 注:等式中的\(P\)是Prover傳送的向量內積證明的承諾值
正確性驗證
已知:
\[L = H(\mathbf{0}^{n'}, \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}},\mathbf{0}^{n'}, \langle \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}} \rangle)
\]
\[P = H(\mathbf{a_{[:n']}}, \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}, \mathbf{b_{[n':]}, \langle \mathbf{a}, \mathbf{b} \rangle}})
\]
\[R = H(\mathbf{a_{[n':]}}, \mathbf{0}^{n'}, \mathbf{0}^{n'}, \mathbf{b_{[:n']}}, \langle \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}} \rangle)
\]
根據\(H\)函式的同態性質,容易計算:
\[L^{x^2} \cdot P \cdot R^{x^{-2}}
\]
\[= H(x^2\mathbf{0}^{n'} + \mathbf{a_{[:n']}} + x^{-2}\mathbf{a_{[n':]}}, x^2\mathbf{a_{[:n']}} + \mathbf{a_{[n':]}} + x^{-2}\mathbf{0}^{n'}, x^2\mathbf{b_{[n']}} + \mathbf{b_{[:n']} + x^{-2}\mathbf{0}^{n'}}, x^2\mathbf{0}^{n'}+\mathbf{b_{[n':]}}+x^{-2}\mathbf{b_{[:n']}}, x^2 \langle \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}} \rangle + \langle \mathbf{a}, \mathbf{b} \rangle + x^{-2}\langle \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}} \rangle)
\]
\[= H(\mathbf{a_{[:n']}} + x^{-2}\mathbf{a_{[n':]}}, x^2\mathbf{a_{[:n']}} + \mathbf{a_{[n':]}}, x^2\mathbf{b_{[n']}} + \mathbf{b_{[:n']}}, \mathbf{b_{[n':]}}+x^{-2}\mathbf{b_{[:n']}}, x^2 \langle \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}} \rangle + \langle \mathbf{a}, \mathbf{b} \rangle + x^{-2}\langle \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}} \rangle)
\]
\[= H(x^{-1}\mathbf{a'}, x\mathbf{a'}, x^\mathbf{b'}, x^{-1}\mathbf{b'}, x^2 \langle \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}} \rangle + \langle \mathbf{a}, \mathbf{b} \rangle + x^{-2}\langle \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}} \rangle)
\]
由於:
\[\langle \mathbf{a'}, \mathbf{b'} \rangle = \langle x\mathbf{a_{[:n']}} + x^{-1}\mathbb{a_{[n':]}}, x^{-1}\mathbf{b_{[:n']}} + x\mathbf{b_{[n':]}} \rangle
\]
\[= (x\mathbf{a_{[:n']}} + x^{-1}\mathbb{a_{[n':]}}) \cdot (x^{-1}\mathbf{b_{[:n']}} + x\mathbf{b_{[n':]}})
\]
\[= x^2 \langle \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}} \rangle + \mathbf{a_{[:n']}}\mathbf{b_{[:n']}} + \mathbf{a_{[n':]}}\mathbf{b_{[n':]}} + x^{-2}\langle \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}}\rangle
\]
\[= x^2 \langle \mathbf{a_{[:n']}}, \mathbf{b_{[n':]}} \rangle + \langle \mathbf{a}, \mathbf{b} \rangle + x^{-2}\langle \mathbf{a_{[n':]}}, \mathbf{b_{[:n']}} \rangle
\]
因此,我們可以得出:
\[L^{x^2} \cdot P \cdot R^{x^{-2}} = H(x^{-1}\mathbf{a'}, x\mathbf{a'}, x^\mathbf{b'}, x^{-1}\mathbf{b'}, \langle \mathbf{a'}, \mathbf{b'} \rangle)
\]
綜上,verifier可以成功驗證步驟4中的等式,即折半演算法的正確性。
複雜度分析
透過折半演算法,在通訊過程中,Prover只傳送了\((P, L, R, \mathbf{a'}, \mathbf{b'}\)), 其中
- \((P, L, R) \in G\), 通訊複雜度為\(O(1)\)
- \(\mathbf{a'}, \mathbf{b'} \in Z_p^{n'}\), 通訊複雜度為\(O(n') = O(n/2)\)
因此透過一輪折半演算法,可以將直接傳送\(\mathbf{a}, \mathbf{b} \in Z_p^{n}\)的複雜度減半。
遞迴折半演算法
透過遞迴折半的方式,我們可以進一步降低複雜度:
- Prover可以在\((\mathbf{a}', \mathbf{b}')\)基礎上繼續執行折半演算法
- 透過\(\log_2n\)次折半(即:向量長度每次減半),可以將\(\mathbf{a}, \mathbf{b} \in Z_p^{n}\)折半為兩個元素\(a, b\in Z_p\)
- 每次執行折半演算法,Prover需要重新生成\(L,R\)
由於互動式證明可以透過Fiat-Shamir方法轉換為非互動式證明,因此在整個遞迴折半演算法中,Prover僅需要傳送以下訊息給Verifier:
\[(L_1, R_1), ..., (L_{\log_2n}, R_{\log_2n}), a, b
\]
- \((L_i, R_i), \forall i \in [1:\log_2n]\)表示第\(i\)次執行折半演算法生成, 所有\((L, R)\)複雜度:\(2\log_2n\)
- \(a, b\)為兩個元素,複雜度為\(O(1)\)
因此Bulletproof透過遞迴折半演算法,成功將通訊複雜度降低為\(2\log_2n\)。
結語
本文詳細分析了Bulletproof範圍證明的最佳化技術 - 折半演算法。透過引入\(H\)函式和遞迴折半演算法,Bulletproof成功將通訊複雜度降低為\(O(2\log_2n)\)。折半演算法的最佳化思想可以應用於其他範圍證明系統,從而進一步提高範圍證明的效率。除了以上最佳化技術外,Bulletproof的多個範圍證明也可以透過批次驗證等技術進一步提高效率。
本文未對Bulletproof遞迴折半演算法構造進行詳細證明,感興趣的讀者可以參考《Bulletproofs: Short Proofs for Confidential Transactions and More》進行深入學習。
參考文獻
- 【1】Non-Interactive Zero-Knowledge Proof
- 【2】Bulletproofs: Short Proofs for Confidential Transactions and More
- 【3】Buuletproof範圍證明之原理