主頁
微信公眾號:密碼應用技術實戰
部落格園首頁:https://www.cnblogs.com/informatics/
GIT地址:https://github.com/warm3snow
簡介
在《門羅幣隱私保護之機密交易》中,我們提到了Bulletproof範圍證明技術,用於證明交易金額(Pedersen密文形式)在一個合理的範圍內。Bulletproof範圍證明是一種零知識範圍證明技術。通常稱為 Zero Knowledge Range Proof
,簡稱 ZKRP
。ZKRP與通用的零知識證明技術相比,具有如下特點:
- 高效性:ZKRP證明的大小和驗證時間都比較小
- 通用性:ZKRP通用性較差,主要用於證明某個值在一個合理的範圍內的場景,如:機密交易、身份驗證、隱私投票、隱私競拍等。
ZKRP實現方案很多,除了通用的ZKP技術外,還有Bulletproof、ZK Set Membership、Hash chains等技術。但由於Bulletproof範圍證明具有效率高、透明設定、可聚合性,與Pedersen承諾的相容性等特點,在實踐中最受歡迎。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{a}, \mathbf{b}> = \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}\)的哈達瑪積。
- \(p(X) = \sum_{i=0}^{d} \mathbf{p_i} \cdot X^i \in Z_p[X]\): 表示模\(p\)的向量多項式,其中\(\mathbf{p_i} \in Z_p^n\)。
- \(<l(X), r(X)> = \sum_{i=0}^{d} \sum_{j=0}^{i} <l_i, r_j> \cdot X^{i+j}\): 表示向量多項式\(l(X)\)和\(r(X)\)的內積。
- \(t(X) = <l(X), r(X)>\): 令\(t(X)\)等於向量多項式\(l(X)\)和\(r(X)\)的內積,則\(\forall x \in Z_p, t(x) = <l(x), r(x)>\)。
- \(\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'\)個元素。
- \(\mathbf{k^n} = (k^0, k^1, k^2, ..., k^{n-1})\): 表示長度為\(n\)的向量\(\mathbf{k}\),其中\(k^i \in Z_p*\)。
- \(P\)和\(V\): 分別表示證明生成者Prover和證明驗證者Verifier
Bulletproof範圍證明
Bulletproof範圍證明依賴於承諾方案,因此流程上與承諾方案類似,包含:
- 承諾:Prover生成承諾,併傳送給Verifier
- 挑戰:Verifier生成挑戰數,併傳送給Prover
- 開啟/響應:Prover揭示明文或者證明,併傳送給Verifier
- 驗證:Verifier驗證Prover提供的證明是否正確
範圍證明形式化表示
下面我們以證明\(v \in [0, 2^n - 1]\)為例,介紹Bulletproof範圍證明的構造和驗證流程。首先,我們先對範圍證明問題進行形式化表示。為了方便描述範圍證明問題,我們將範圍證明問題形式化表示如下:
其中,\(g\)和\(h\)是\(G\)生成元,\(V\)是\(v\)的Pedersen承諾,\(\gamma\)是隨機數,\(v\)是需要證明的數值。從上述公式可以看出:
- 範圍證明問題被轉換成了兩個部分:\(v\)的Pedersen承諾和\(v\)的範圍大小
- \(v\)的Pedersen承諾:\(V = g^v \cdot h^\gamma\),與標準的Pedersen承諾形式一致
- \(v\)的範圍大小:\(v \in [0, 2^n - 1]\),保證了\(v\)的值在一個合理的範圍內。其中n是一個固定的數值,通常為64。
同時為了更方便的進行範圍證明構造,Bulletproof會將範圍證明問題轉換為以下等式:
分析以上以上幾個等式,可以很容易得出結論:
- 結論1:等式\(v = \sum_{i=0}^{n} a_i \cdot 2^i\)實際上是\(v\)的二進位制表達
- 結論2:等式 \(\mathbf{a_R} = \mathbf{a_L} - \mathbf{1^n}\) 和等式\(\mathbf{a_L} \circ \mathbf{a_R} = \mathbf{0^n}\)限制了\(\mathbf{a_L}\)中元素\(a_i\)的取值範圍必須為\(0\)或\(1\)
由於\(\mathbf{a_L} \circ \mathbf{a_R} = \mathbf{a_L} \circ (\mathbf{a_L} - \mathbf{1^n}) = \mathbf{0^n}\),因此\(\forall i \in [0, n], \quad a_i \cdot (a_i - 1) = 0\), 即\(a_i\)的值為0或1,因此結論2成立。
向量內積表示
Bulletproof範圍證明會將等式\((1)\)轉換為向量內積形式,並將多個向量內積證明轉換為一個向量內積證明問題。具體轉換過程如下:
- 將等式\((1)\)轉換為向量內積形式
其中,\(\mathbf{y} = (y^0, y^1, y^2, ..., y^{n-1})\)是長度為\(n\)的向量,\(y\)是一個隨機數。由於\(\mathbf{0}\)向量與任意向量的內積為0,顯然以上等式與\((1)\)等價。
- 將多個向量內積證明轉換為一個向量內積證明問題
透過引入另一個隨機數\(z\),我們可以將等式\((2)\)合併為:
為了方便後面範圍證明的構造和驗證,我們將上述等式展開為:
其中,\(\delta(y, z) = (z - z^2) \cdot <\mathbf{1}^n, \mathbf{y}^n> - z^3<\mathbf{1}^n, \mathbf{2}^n> \in Z_p\),從上面等式上我們可以瞭解到:
- 展開後的等式左邊為向量內積形式
- 等式右邊為常量,透過\((z, y, v)\)進行計算,計算過程不涉及\(\mathbf{a_L}\)和\(\mathbf{a_R}\)。
範圍證明多項式表達
我們知道在零知識證明中,一般將證明問題轉換為多項式形式,然後Prover的多項式的承諾可以透過Verifier在隨機開啟點上驗證完成。在Bulletproof中,Prover會將等式\((3)\)轉換為多項式形式,並由Verifier驗證多項式的承諾是否正確。
首先我們定義兩個線性向量多項式\(l(X), r(X) \in Z_p^n[X]\), 和一個二次多項式\(t(X) \in Z_p[X]\), 並定義如下:
其中,\(\mathbf{s_L}\)和\(\mathbf{s_R}\)是長度為\(n\)的隨機向量,\(t_0, t_1, t_2 \in Z_p\)
透過上述定義,我們可以將等式\((3)\)轉換為多項式\(t(X)\)的形式, 其中常數項\(t_0\)等於\(z^2 \cdot v + \delta(y, z)\), 即等式\((3)\)右邊部分。透過對多項式\(t(X)\)的承諾-挑戰-開啟-驗證,我們可以間接證明等式\((3)\)的正確性,即完成了對\(v \in [0, 2^n - 1]\)的範圍證明。
承諾
Bulletproof首先會對關鍵引數\((\mathbf{a_L}, \mathbf{a_R})\)進行承諾。步驟如下:
- 計算承諾
生成隨機數\(\alpha, \rho, \tau_1, \tau_2 \in z_p\)和隨機向量\(\mathbf{s_L}\), \(\mathbf{s_R} \in z_p^n\), 並計算承諾\(C = (V, A, S, T_1, T_2)\)
需要說明的是:
- \(\mathbf{a_L}\)和\(\mathbf{a_R}\)與等式\((2)\)中的對應。
- \(A\)是\(\mathbf{a_L}\)和\(\mathbf{a_R}\)的Pedersen承諾
- \(S\)是\(\mathbf{s_L}\)和\(\mathbf{s_R}\)的Pedersen承諾, 用於隱藏範圍證明多項式表達中使用的\(\mathbf{a_L}\)和\(\mathbf{a_R}\)的值(注: \(\mathbf{a_L}\)和\(\mathbf{a_R}\)與\(v\)強繫結,因此需要隱藏)
- \(T_1\)和\(T_2\)是對多項式\(t(X)\)的係數承諾
- Prover將承諾\(C\)傳送給Verifier
挑戰
Verifier生成隨機挑戰\(x, y, z \in Z_p^*\),併傳送給Prover, 其中:
- \(x\)是對多項式承諾的挑戰
- \(y\)用於生成公式\((2)\)中的\(\mathbf{y}\),是對\(v\)範圍的挑戰
- \(z\)對應公式\((3)\)中的\(z\),是對等式\((3)\)的挑戰
開啟/響應
Prover根據接收到的挑戰\(y, z\),計算多項式\(t(X)\)的值,並將響應傳送給Verifier
- 計算多項式點開啟\(l(x), r(x), t(x)\)
- 計算隨機響應\(\tau_x, \mu\)
注:Prover在開啟階段時,計算的響應用到了承諾階段的一些隨機數和隨機向量,如\(\alpha, \rho, \tau_1, \tau_2, \mathbf{s_L}, \mathbf{s_R}\)等。
- Prover將(\(\tau_x, \mu, t, \mathbf{l}, \mathbf{r}\))作為響應傳送給Verifier
驗證
Verifier接收到Prover的響應後,驗證Prover提供的證明是否正確。Verifier需要驗證多個等式是否成立:
-
驗證\(t = t(x) = t_0 + t_1 \cdot x + t_2 \cdot x^2\),方式如下:
\(g^th^{\tau_x} \stackrel{?}{=} V^{z^2} \cdot g^{\delta(y, z)} \cdot T_1^x \cdot T_2^{x^2}\) -
驗證\(\mathbf{l}\)和\(\mathbf{r}\)是否正確,方式如下:
$ P \stackrel{?}{=} h^{\mu} \cdot \mathbf{g}^{\mathbf{l}} \cdot (\mathbf{h'})^{\mathbf{r}}$
其中, \(P = A \cdot S^x \cdot \mathbf{g}^{-z} \cdot (\mathbf{h'})^{z \cdot \mathbf{y}^n + z^2 \cdot \mathbf{2}^n}\)\(\forall i \in [1, n], h_i^{'} = h_i^{y^{-i+1}}\) 即:\(\mathbf{h'} = (h_1, h_2^{y^{-1}}, h_3^{y^{-2}}, ..., h_n^{y^{-n}})\)
-
驗證\(t\)是否正確
\(t \stackrel{?}{=} <\mathbf{l}, \mathbf{r}>\)
如果上述等式都成立,則Verifier接受Prover的範圍證明,即\(v \in [0, 2^n - 1]\); 否則Verifier拒絕Prover的證明。
正確性驗證
- 驗證\(t = t(x) = t_0 + t_1 \cdot x + t_2 \cdot x^2\)
因此,\(g^th^{\tau_x} = V^{z^2} \cdot g^{\delta(y, z)} \cdot T_1^x \cdot T_2^{x^2}\)成立,同時從上述推導中我們可以看到主要是驗證了\(t=t(x)\)的正確性。
- 驗證\(\mathbf{l}\)和\(\mathbf{r}\)是否正確
根據$\mathbf{h'}的定義,我們可以得到:
因此\(P\)可以簡化為:
因此, \(P = h^{\mu} \cdot \mathbf{g}^{\mathbf{l}} \cdot (\mathbf{h'})^{\mathbf{r}}\)成立,從上面公式我們可以看到主要是驗證了\(\mathbf{l}\)和\(\mathbf{r}\)的正確性。
- 驗證\(t\)是否正確
t的正確性驗證比較簡單,由於Prover在開啟階段計算的\(t\)是多項式\(l(x)\)和\(r(x)\)的內積,因此只需要Verifier重新計算\(l(x)\)和\(r(x)\)的內積,然後與Prover提供的\(t\)進行比較即可。如果相等,則說明Prover提供的\(t\)是正確的。
結語
本文作為Bulletproof範圍證明系列文章的第一篇,詳細介紹了Bulletproof範圍證明的多項式表達、承諾、挑戰、開啟、驗證等流程。Bulletproof範圍證明是一種零知識證明技術,主要用於證明某個值在一個合理的範圍內。Bulletproof範圍證明具有高效性、透明設定、可聚合性等特點,因此在實際應用中得到了廣泛的應用。
本文未對Bulletproof範圍證明的最佳化、聚合、批次驗證等技術進行詳細介紹,後續文章會逐步展開對Bulletproof的進一步介紹,展示Bulletproof備受歡迎的魅力所在。
- 【1】Non-Interactive Zero-Knowledge Proof
- 【2】Bulletproofs: Short Proofs for Confidential Transactions and More