門羅幣隱私保護之範圍證明

warm3snow發表於2024-11-01

主頁

微信公眾號:密碼應用技術實戰
部落格園首頁: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 \in G, V, \gamma; v, \gamma \in Z_p : V = g^v \cdot h^\gamma \land v \in [0, 2^n - 1]) \} \]

其中,\(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會將範圍證明問題轉換為以下等式:

\[\begin{equation} v = \sum_{i=0}^{n} a_i \cdot 2^i \quad and \quad \mathbf{a_R} = \mathbf{a_L} - \mathbf{1^n} \quad and \quad \mathbf{a_L} \circ \mathbf{a_R} = \mathbf{0^n} \end{equation} \]

分析以上以上幾個等式,可以很容易得出結論:

  • 結論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. 將等式\((1)\)轉換為向量內積形式

\[\begin{equation} v = <\mathbf{a_L}, \mathbf{2}^n> \quad and \quad <\mathbf{a_L} - \mathbf{1}^n - \mathbf{a_R}, \mathbf{y}^n> = 0 \quad and \quad <\mathbf{a_L}, \mathbf{a_R} \circ \mathbf{y}^n> = 0 \end{equation} \]

其中,\(\mathbf{y} = (y^0, y^1, y^2, ..., y^{n-1})\)是長度為\(n\)的向量,\(y\)是一個隨機數。由於\(\mathbf{0}\)向量與任意向量的內積為0,顯然以上等式與\((1)\)等價。

  1. 將多個向量內積證明轉換為一個向量內積證明問題

透過引入另一個隨機數\(z\),我們可以將等式\((2)\)合併為:

\[z^2 \cdot <\mathbf{a_L}, \mathbf{2}^n> + z \cdot <\mathbf{a_L} - \mathbf{1}^n - \mathbf{a_R}, \mathbf{y}^n> + <\mathbf{a_L}, \mathbf{a_R} \circ \mathbf{y}^n> = z^2 \cdot v \]

為了方便後面範圍證明的構造和驗證,我們將上述等式展開為:

\[\begin{equation} <\mathbf{a_L} - z \cdot \mathbf{1}^n, \mathbf{y}^n \circ (\mathbf{a_R} + z \cdot \mathbf{1}^n) + z^2 \cdot \mathbf{2}^n> = z^2 \cdot v + \delta(y, z) \end{equation} \]

其中,\(\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]\), 並定義如下:

\[l(X) = \mathbf{a_L} - z \cdot \mathbf{1}^n + \mathbf{s_L} \cdot X \in Z_p^n[X] \]

\[r(X) = \mathbf{y}^n \circ (\mathbf{a_R} + z \cdot \mathbf{1}^n + \mathbf{s_R} \cdot X) + z^2 \cdot \mathbf{2}^n \in Z_p^n[X] \]

\[t(X) = <l(X), r(X)> = t_0 + t_1 \cdot X + t_2 \cdot X^2 \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})\)進行承諾。步驟如下:

  1. 計算承諾
    生成隨機數\(\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)\)

\[V = g^v \cdot h^{\gamma} \in G \]

\[A = h^{\alpha}{\mathbf{g}}^{\mathbf{a_L}}{\mathbf{h}}^{\mathbf{a_R}} \in G \]

\[S = h^{\rho}{\mathbf{g}}^{\mathbf{s_L}}{\mathbf{h}}^{\mathbf{s_R}} \in G \]

\[T_1 = g^{t_1}h^{\tau_1}, \quad T_2 = g^{t_2}h^{\tau_2} \in G \]

需要說明的是:

  • \(\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)\)的係數承諾
  1. 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

  1. 計算多項式點開啟\(l(x), r(x), t(x)\)

\[\mathbf{l} = l(x) = \mathbf{a_L} - z \cdot \mathbf{1}^n + \mathbf{s_L} \cdot x \in Z_p^n \]

\[\mathbf{r} = r(x) = \mathbf{y}^n \circ (\mathbf{a_R} + z \cdot \mathbf{1}^n + \mathbf{s_R} \cdot x) + z^2 \cdot \mathbf{2}^n \in Z_p^n \]

\[t = <l(x), r(x)> = t_0 + t_1 \cdot x + t_2 \cdot x^2 \in Z_p \]

  1. 計算隨機響應\(\tau_x, \mu\)

\[\tau_x = z^2 \cdot \gamma + \tau_1 \cdot x + \tau_2 \cdot x^2 \in Z_p \]

\[\mu = \alpha + \rho \cdot x \in Z_p \]

注:Prover在開啟階段時,計算的響應用到了承諾階段的一些隨機數和隨機向量,如\(\alpha, \rho, \tau_1, \tau_2, \mathbf{s_L}, \mathbf{s_R}\)等。

  1. Prover將(\(\tau_x, \mu, t, \mathbf{l}, \mathbf{r}\))作為響應傳送給Verifier

驗證

Verifier接收到Prover的響應後,驗證Prover提供的證明是否正確。Verifier需要驗證多個等式是否成立:

  1. 驗證\(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}\)

  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}})\)

  3. 驗證\(t\)是否正確
    \(t \stackrel{?}{=} <\mathbf{l}, \mathbf{r}>\)

如果上述等式都成立,則Verifier接受Prover的範圍證明,即\(v \in [0, 2^n - 1]\); 否則Verifier拒絕Prover的證明。

正確性驗證

  1. 驗證\(t = t(x) = t_0 + t_1 \cdot x + t_2 \cdot x^2\)

\[V^{z^2} \cdot g^{\delta(y, z)} \cdot T_1^x \cdot T_2^{x^2} \\ = (g^v \cdot h^{\gamma})^{z^2} \cdot g^{\delta(y, z)} \cdot (g^{t_1}h^{\tau_1})^x \cdot (g^{t_2}h^{\tau_2})^{x^2} \\ = g^{v \cdot z^2} \cdot h^{\gamma \cdot z^2} \cdot g^{\delta(y, z)} \cdot g^{t_1 \cdot x} \cdot h^{\tau_1 \cdot x} \cdot g^{t_2 \cdot x^2} \cdot h^{\tau_2 \cdot x^2} \\ = g^{v \cdot z^2 + \delta(y, z) + t_1 \cdot x + t_2 \cdot x^2} \cdot h^{\gamma \cdot z^2 + \tau_1 \cdot x + \tau_2 \cdot x^2} \\ = g^{t_0 + t_1 \cdot x + t_2 \cdot x^2} \cdot h^{z^2 \cdot \gamma + \tau_1 \cdot x + \tau_2 \cdot x^2} \\ = g^t \cdot h^{\tau_x} \]

因此,\(g^th^{\tau_x} = V^{z^2} \cdot g^{\delta(y, z)} \cdot T_1^x \cdot T_2^{x^2}\)成立,同時從上述推導中我們可以看到主要是驗證了\(t=t(x)\)的正確性。

  1. 驗證\(\mathbf{l}\)\(\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} \\ = h^{\alpha}{\mathbf{g}}^{\mathbf{a_L}}{\mathbf{h}}^{\mathbf{a_R}} \cdot (h^{\rho}{\mathbf{g}}^{\mathbf{s_L}}{\mathbf{h}}^{\mathbf{s_R}})^x \cdot \mathbf{g}^{-z} \cdot (\mathbf{h'})^{z \cdot \mathbf{y}^n + z^2 \cdot \mathbf{2}^n} \\ = h^{\alpha}{\mathbf{g}}^{\mathbf{a_L}}{\mathbf{h}}^{\mathbf{a_R}} \cdot h^{\rho \cdot x}{\mathbf{g}}^{\mathbf{s_L} \cdot x}{\mathbf{h}}^{\mathbf{s_R} \cdot x} \cdot \mathbf{g}^{-z} \cdot (\mathbf{h'})^{z \cdot \mathbf{y}^n + z^2 \cdot \mathbf{2}^n} \\ = h^{\alpha + \rho \cdot x}{\mathbf{g}}^{\mathbf{a_L} + \mathbf{s_L} \cdot x - z \cdot \mathbf{1}^n} \cdot {\mathbf{h}}^{\mathbf{a_R} + \mathbf{s_R} \cdot x} \cdot (\mathbf{h'})^{z \cdot \mathbf{y}^n + z^2 \cdot \mathbf{2}^n} \\ = h^{\mu}{\mathbf{g}}^{\mathbf{l}} \cdot h^{\mathbf{a_R} + \mathbf{s_R} \cdot x} \cdot (\mathbf{h'})^{z \cdot \mathbf{y}^n + z^2 \cdot \mathbf{2}^n} \\ \]

根據$\mathbf{h'}的定義,我們可以得到:

\[\mathbf{h'}^{\mathbf{y^n}} = (h_1^{y^0}, (h_2^{y^{-1}})^{y^1}, (h_3^{y^{-2}})^{y^2}, ..., (h_n^{y^{-n+1}})^{y^{n-1}}) = (h_1, h_2, h_3, ..., h_n) = \mathbf{h} \]

因此\(P\)可以簡化為:

\[P = h^{\mu}{\mathbf{g}}^{\mathbf{l}} \cdot h^{\mathbf{a_R} + \mathbf{s_R} \cdot x} \cdot (\mathbf{h'})^{z \cdot \mathbf{y}^n + z^2 \cdot \mathbf{2}^n} \\ h^{\mu} \cdot \mathbf{g}^{\mathbf{l}} \cdot (\mathbf{h'})^{\mathbf{y}^n \circ (\mathbf{a_R} + \mathbf{s_R} \cdot x) + z \cdot \mathbf{y}^n + z^2 \cdot \mathbf{2}^n} \\ = h^{\mu} \cdot \mathbf{g}^{\mathbf{l}} \cdot (\mathbf{h'})^{\mathbf{y}^n \circ (\mathbf{a_R} + z \cdot \mathbf{1}^n + \mathbf{s_R} \cdot x) + z^2 \cdot \mathbf{2}^n} \\ = h^{\mu} \cdot \mathbf{g}^{\mathbf{l}} \cdot (\mathbf{h'})^{\mathbf{r}} \]

因此, \(P = h^{\mu} \cdot \mathbf{g}^{\mathbf{l}} \cdot (\mathbf{h'})^{\mathbf{r}}\)成立,從上面公式我們可以看到主要是驗證了\(\mathbf{l}\)\(\mathbf{r}\)的正確性。

  1. 驗證\(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

相關文章