給定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計算量相對較小。