零知識證明 - Groth16計算詳解

買賣虛擬貨幣
Groth26演算法是zkSNARK的典型演算法,目前在ZCash,Filecoin,Coda等專案中使用。本文從計算量的角度詳細分析Groth26計算。Groth26計算分成三個部分:Setup針對電路生成Pk/Vk(證明/驗證金鑰),Prove在給定witness/statement的情況下生成證明,Verify透過Vk驗證證明是否正確。本文中所有的術語和數學符號和Groth26論文保持一致(On the Size of Pairing-based Non-interactive Arguments,具體的計算在17/18頁):https://eprint.iacr.org/2016/260.pdf對Groth26演算法的理解可檢視:零知識證明 - Groth26演算法介紹對libSnark程式碼庫的理解可檢視:
零知識證明 - libsnark原始碼分析1. 電路描述所有的電路描述有個專業的術語:Relation(變數和變數的關係描述)。描述Relation的語言很多:R1CS,QAP,tinyRAM,bacs等等。目前開發,電路一般採用R1CS語言描述。R1CS相對來說,非常直觀。A*B=C(A/B/C分別是輸入變數的線性組合)。但是,要應用Groth26演算法,需要將R1CS描述的電路,轉化為QAP描述。兩種電路描述語言的轉化,稱為Reduction。1.1 R1CS描述

給定M'個變數(第一個變數約定為恆量1),以及N'個約束,所有的R1CS描述可以表示如下:

每一行是一個約束。舉例,第一行的約束表示的是:

1.2 QAP轉化

介紹具體的轉化之前,先介紹一個簡單的術語,拉格朗日插值以及拉格朗日basis。

給定一系列的x和y的對應關係,透過拉格朗日插值的方式,可以確定多項式:

1.3 domain選擇

針對每個變數,已經知道N個y值。如何選擇這些y值,對應的x值?這個就是domain的選擇。選擇domain,主要考慮兩個計算效能:1/ 拉格朗日插值 2/FFT和iFFT。libfqfft的原始碼提供了幾種domain:
1) Basic Radix-2 2)Extended Radix-2 3) Step Radix-2 4) Arithmetic Sequence 5) Geometric Sequence

選擇哪一種domain和輸入個數(M)有關。為了配合特定domain的計算,domain的階(M)會稍稍變大。

確定了domain,也就確定了domain上的一組元素s:

2. Setup計算

是Vk。其他部分是Pk。可以看出,Vk的大小取決於公共輸入的變數個數,相對來說數量比較小。Pk的資料量大小和所有的變數個數相關。計算過程,主要由scalarMul組成。

3. Prove計算

在domain選擇後,U*V=W,可以變換為如下的多項式方程:

很顯然,生成證明的計算量主要由四個Multiexp組成(A-1,B-1,C-2),和變數個數以及約束的個數有關。在一個大型電路中,生成證明的時間比較長(秒級,甚至分鐘級)。

4. Verify計算

在已知證明以及Vk的情況下,透過配對(pairing)函式,很容易計算如下的等式是否成立。計算在毫秒級。

總結:

Groth26演算法的主要計算量由兩部分組成:FFT/iFFT以及MultiExp。在生成證明時,需要4次iFFT以及三次FFT計算。Setup計算和生成證明時,需要大量的MultiExp。Verify計算量相對較小。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;