###### tags: `ZKP`
# ZKP QAP 筆記
https://vitalik.ca/general/2021/01/26/snarks.html
我持有一個祕密數字123
將sha256(123) 一億次 證明了一個 0x57d00485aa...的數值
驗證者可以進行比運算一億次還要快的驗證
同時該證明不會透漏輸入資訊
一種方法是random sample
使驗證者能驗證該證明中的500個計算
抽取運算一億次中的500次隨機運算進行驗證
但這樣也會導致一些問題 假設是merkle tree 證明者竄改了其中的一次運算 驗證者有可能一輩子都無法發現 錯的那一格 除非剛好抽樣倒
這也導致該證明其實是無效的
(只有15625是錯的)

---
1.https://medium.com/@VitalikButerin/quadratic-arithmetic-programs-from-zero-to-hero-f6d558cea649
2.https://medium.com/@VitalikButerin/zk-snarks-under-the-hood-b33151a013f6
https://zhuanlan.zhihu.com/p/33307259
(下兩則尚未看全部)
https://medium.com/taipei-ethereum-meetup/%E6%B7%B1%E5%85%A5%E7%9E%AD%E8%A7%A3-zk-snarks-7a0187f399f1
https://medium.com/@gregshen0925/%E8%BC%95%E9%AC%86%E4%BA%86%E8%A7%A3-zk-snark-%E7%AC%AC%E4%BA%8C%E7%AF%87-94f6e3483290

https://eprint.iacr.org/2013/879.pdf
https://www.jianshu.com/p/7b772e5cdaef
code -> circom -> R1CS -> QAP -> PCP -> Proof
## 流程:
1. R1CS產出時 就能產出witness 還沒QAP
2. Powers of Tau 就是本文的t
https://medium.com/coinmonks/announcing-the-perpetual-powers-of-tau-ceremony-to-benefit-all-zk-snark-projects-c3da86af8377
snarkjs也有介紹
3. snarkjs groth16 setup multiplier2.r1cs pot12_final.ptau multiplier2_0000.zkey
計算QAP並透過t產生零知識證明 應該是這
因為此處用到r1cs跟t
而且可信裝置是使用t 也是在這運算
同時QAP可以先用t產生方程式 ECC再轉換方程式變ecc點就行
可以看標題**如下便是QAP**
下一章的**QAP檢查**才有套到witness
G * A_1(t), G * A_1(t) * k_a
G * A_2(t), G * A_2(t) * k_a
這裡也還沒用到witness 就已經轉換ECC了
---
因此,到目前為止,證明者必須給出:
π_a = G * A(t), π'_a = G * A(t) * k_a
π _ b = G * B(t), π'_ b = G * B(t) * k_b
π_c = G * C(t), π'_c = G * C(t) * k_c
(請注意,證明者實際上不需要知道(也不應該知道!)t、k_a、k_b 或 k_c 來計算這些值;相反,證明者應該能夠僅根據我們添加到可信設置的點來計算這些值。)
這應該也代表關於t的值 證明者是不知道的 他能接觸到的是已經被轉化過的方程式
證明者只知道已被ECC帶入t後產生的ECC點 不知道t代表無法產生這些點
看一下最後vertify 裡面提的公式可能有解答
---
4. snarkjs groth16 prove multiplier2_0001.zkey witness.wtns proof.json public.json
proof.json 是透過隱藏過的QAP產生
然後再用這隱藏過的zkey用witness驗證
(可以查setup跟prove 才能確定哪邊使用ECC隱藏QAP)
QAP只是一個易於驗證的多項式輸入格式 不會隱藏
是後續會用ECC隱藏QAP的多項式
---
大項可以分類乘三項
1.QAP的產生 同時產出witness (witness不一定是對的 在此題x=3會產出對的 但在其他輸入一樣能產出witness 只是驗證時運算結果會失敗)
2.一個相當複雜的過程為witness創建零知識證明 (witness應該不會隱藏 是隱藏產生proof的方程式 是透過ECC隱藏QAP的A B C方程式 )
3.額外的驗證他人產生的證明 (vertify)
程式流程是 circom產生R1CS 輸入資料 產生witness
snark用tau 跟r1cs 產生一個vertify_key
vertify_key跟witness 產生proof
主要應該是proof部分 如何隱藏wintess運算產生的證明(因為要看不出輸入 例如本例的x=3)
以及vertify_key如何產生可運算的方程式
https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell
這篇也不錯 簡略的介紹了流程
## 文章開始
1.先設計一個簡單的方程式 x^3+x+5=35
這邊可看出x的解是3 即是witness=3

先產生一個floating的動作 如同撰寫circom電路
看懂了下面運算後 這邊其實很重要
電路必須維持 a*b=c的模式 因為後續都是使用a*b-c的方式運算
就算寫a+b=c 後續轉換過程也會變成 (a*b)*1=c
也是維持一個變數一個變數=答案變數
這是因為後續R1CS[a,b,c]運算向量的需要
sym_1= x*x
y = sym_1 * x
sym_2 = y+x
~out = sym_2 + 5
2.將電路轉成R1CS(一階約束系統)
R1CS一個三圍向量(a,b,c)組成的序列 先舉一個簡單的例子
```
R1CS向量解是s,s必須滿足 (s*a)*(s*b)-(s*c)=0
可看成a*b-c=0 s是其中的解向量 就是witness
a = (5,0,0,0,0,1)
b = (1,0,0,0,0,0)
c = (0,0,1,0,0,0)
s = (1,3,35,9,27,30)
```
算法如圖

上述是單個方程式的例子(例如a*b-c)
這邊開始將上述floating的電路**變數**一個一個轉化成(a,b,c)向量
'~one',' x', '~out', 'sym_1', 'y', 'sym_2'
(順序沒差 只是在對應abc向量的時候位置要對 ~one是虛擬變量 嚴格來說不是從電路出來的 像是下列說到解析加法的時候 便會用上)
此時的**變數便代表單個向量的長度** EX:a[0,0,0,0,0,0]
1.第一個門 x*x - sym_1
如同上述例子 遵守 a*b-c
所以a=x,b=x,c=sym_1
從對應到的變數填入數字
'~one',' x', '~out', 'sym_1', 'y', 'sym_2'
a = [0,1,0,0,0,0]
b = [0,1,0,0,0,0]
c = [0,0,0,1,0,0]
此時能看出解 s=[0,3,0,9,0,0] 如同一開始說的witness x=3
假設我們輸入witness x=7 第一個門也會通過驗證
s=[0,7,0,49,0,0] 因為第一個門答案是對的
只是當後續的門計算不對了 就會失敗
2.
第二個門 sym_1 * x - y
'~one',' x', '~out', 'sym_1', 'y', 'sym_2'
a = [0,0,0,1,0,0]
b = [0,1,0,0,0,0]
c = [0,0,0,0,1,0]
3.
y+x -sym_2
加減法的運算與平常不同 要看成 (y+x)*1 - sym_2
虛擬變量~one就是這樣用的
'~one',' x', '~out', 'sym_1', 'y', 'sym_2'
a = [0,1,0,0,1,0]
b = [1,0,0,0,0,0]
c = [0,0,0,0,0,1]
4.
sym_2 + 5 - ~out
-> ( sym_2 + 5)*1 - ~out
'~one',' x', '~out', 'sym_1', 'y', 'sym_2'
a = [5,0,0,0,0,1]
b = [1,0,0,0,0,0]
c = [0,0,1,0,0,0]
可以算出witness解向量是 [1,3,35,9,27,30]
(透過input.json產生的解向量應該就是這個)
---
產出完整的R1CS
A
[0, 1, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0]
[0, 1, 0, 0, 1, 0]
[5, 0, 0, 0, 0, 1]
B
[0, 1, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0]
C
[0, 0, 0, 1, 0, 0]
[0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 1]
[0, 0, 1, 0, 0, 0]
---
## QAP
接下來要把R1CS轉換成QAP 他們實現的邏輯是相同的
只是R1CS是轉換成點積向量 QAP是換成多項式
此時會透過拉格朗日差值法進行轉換
拉格朗日差值法用於橫穿數個給定點後產生的多項式(x1,y1),(x2,y2),(x3,y3)

更正: 第一個(x-2)(x-2) / (1-2)(1-3) 寫錯了 正確是(x-2)(x-3) / (1-2)(1-3)
現在要將四個長度為六的向量 轉換為各有六組多項式
a六組 b六組 c六組
從a的第1列開始(0,0,0,5) 產生一組多項式
~到第6列(0,0,0,1)就有六組
拉格朗日是(x-x2)(x-x3)(x-x4)
目前i有4個點 代表有四個電路約束 所以會產生三階方程式
(從這邊可以看得出電路越多 次方越高 x^i-1*x^i*...x^2*x)
- 這邊是純粹的拉格朗日計算 差別只在從x=1,x=2,x=...,x=4
- y=向量第一列開始y=0,y=0,y=0,y=5 產生一個拉格朗日方程式
- 6個變數 6列 a=產生6個拉格朗日方程式 b=... c=...
先從a向量第一列開始計算
1.產生的方式是固定x=1,x=2,x=3,x=4 (有四道門 所以是到4)
2.y就是每個陣列第i個開始 從第一列開始 y=0,y=0,y=0,y=5
所以有點(1,0) (2,0) (3,0) (4,5)
3.透過拉格朗日計算 前三個y=0會直接*0 此時來算(4,5)



放進方程式是透過升序放的 所以才反過來
0.833是5/6化簡過後 可以發現與文章先給的答案一樣
4.[-5.0, 9.166, -5.0, 0.833]
透過拉格朗日差值法計算 便可產出每一個向量a,b,c的多項式
## 如下便是QAP
A polynomials
[-5.0, 9.166, -5.0, 0.833] (0.833x^3-5x^2+9.166x-5)
[8.0, -11.333, 5.0, -0.666]
[0.0, 0.0, 0.0, 0.0]
[-6.0, 9.5, -4.0, 0.5]
[4.0, -7.0, 3.5, -0.5]
[-1.0, 1.833, -1.0, 0.166]
B polynomials
[3.0, -5.166, 2.5, -0.333]
[-2.0, 5.166, -2.5, 0.333]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
C polynomials
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[-1.0, 1.833, -1.0, 0.166]
[4.0, -4.333, 1.5, -0.166]
[-6.0, 9.5, -4.0, 0.5]
[4.0, -7.0, 3.5, -0.5]
此時需先用x=1評估所有多項式
下列是x=1產出的各多項式答案
a x=1(0, 1, 0, 0, 0, 0)
b x=1(0, 1, 0, 0, 0, 0)
c x=1(0, 0, 0, 1, 0, 0)
會發先產出的與原先的向量一模一樣
透過x=2,x=3,x=4便能還原最初的向量
---
## QAP檢查
現在這種瘋狂的轉變有什麼意義呢?答案是,我們現在可以通過對多項式進行點積檢查 例如x=1 產生了上述的(0, 1, 0, 0, 0, 0)
就能同時檢查A所有的約束 而不是單獨檢查 R1CS 中的約束
此時我們需要檢查當x=1,x=2,x=3,x=4
A(x) * B(x) - C(x) 答案是不是都為0 只要其中一個不為0
代表witness錯誤 驗證失敗
QAP應該是為了效率以及snakr需要的輸入格式
透過witness與方程式乘積 產生出只需要直接帶入x=1,x=2... 檢查為0的方程式
**一個只需帶入x的單一方程式**

H = 0
原R1CS x帶入產生很快
s = [~one, x, ~out, sym_1, sym_2, sym_3] =
[1, 3, 35, 9, 27, 30]
witness解向量是 [1,3,35,9,27,30]
A polynomials
[-5.0, 9.166, -5.0, 0.833]
[8.0, -11.333, 5.0, -0.666]
[0.0, 0.0, 0.0, 0.0]
[-6.0, 9.5, -4.0, 0.5]
[4.0, -7.0, 3.5, -0.5]
[-1.0, 1.833, -1.0, 0.166]
B polynomials
[3.0, -5.166, 2.5, -0.333]
[-2.0, 5.166, -2.5, 0.333]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
C polynomials
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[-1.0, 1.833, -1.0, 0.166]
[4.0, -4.333, 1.5, -0.166]
[-6.0, 9.5, -4.0, 0.5]
[4.0, -7.0, 3.5, -0.5]
A . s = [43.0, -73.333, 38.5, -5.166]
B . s = [-3.0, 10.333, -5.0, 0.666]
C . s = [-41.0, 71.666, -24.5, 2.833]
計算一下B的就好 比較簡單(X
[1,3,35,9,27,30] * B
B->
[
1*3+3*(-2),
1*(-5.166)+3*5.166,
1*2.5+3*(-2.5),
1*(-0.333)+3*0.333
]
B . S = [-3,10.333,-5.0,0.666] 原答案相同
---
此時QAP產生的方程式為
A . s = [43.0, -73.333, 38.5, -5.166]
B . s = [-3.0, 10.333, -5.0, 0.666]
C . s = [-41.0, 71.666, -24.5, 2.833]
需透過x=1,x=2,x=3,x=4去驗證 等於0代表正確
但實際不會在此帶入一個一個檢查
而是用底下的方程式判斷
A(x) * B(x) - C(x) 能否被 Z(x)[(x-1)(x-2)(x-3)(x-4)] 整除來判斷 下面有解釋
(猜測零知識提供的可能就是這個方程式
因為他產出的是用拉格朗日通過點的方程式 以及隨著電路越多x=1,x=2,...,x=i 如果電路constraint=200001 就有200000個X可選擇使用)

製造一個t = A . s * B . s - C . s
t/Z=h且沒有餘數 代表等式成立 即通過驗證
Z=(x-1)(x-2)(x-3)... 的拉格朗日方程式 所以帶入x都將為0
H若是Z的倍數 (t/Z = 整數 且沒有餘數) 代表x怎麼帶 H也將為0
為了 省運算開銷 只需證明H是不是Z的倍數
詳細是下列計算過後 看t/Z 有沒有產生餘數而定
Now, A . s * B . s — C . s:
(這邊t是直接用的x的方程式相乘 a的方程式*b的方程式 - C的方程式 看超久 一直以為是向量乘法 想說怎麼算都不可能長這樣)
(-5.166x^(3)+38.5x^(2)-73.333x+43)*(0.666x^(3)-5x^(2)+10.333x-3) = 圖

圖 (a*b) = [-129.0, 664.318, -1088.2498, 808.6215, -294.777, 51.5, -3.444]
-C [-41.0, 71.666, -24.5, 2.833]
= [-88.0, 592.666, -1063.777, 805.833, -294.777, 51.5, -3.444]
與文章答案相同
(實際運算時應該是此處 t跟z帶入x=1 t/z看有沒有餘數
or h能直接檢驗 不確定)
t = [-88.0, 592.666, -1063.777, 805.833, -294.777, 51.5, -3.444]
Now, the minimal polynomial Z = (x - 1) * (x - 2) * (x - 3) * (x - 4):
Z = [24, -50, 35, -10, 1] (拉格朗日方程式x的係數)
And if we divide the result above by Z, we get:
文章答案h
h = t / Z = [-3.666, 17.055, -3.444]
不過我實際用Mathway divide方程式是除不盡 可能跟小數點的運算有關
但其實無所謂 因為在真正的ZK-snarks 有限域出現的都會是整數

QAP到此結束 可看出透過電路 產生floating R1CS
透過R1CS能得到a,b,c向量
QAP透過**拉格朗日**得到a,b,c**多個多項式**
驗證使用witness的s向量
計算(s*a) * (s*b) - (s*c) 會不會等於0 等於0代表是正確的輸入
只是QAP會將方程式壓縮成一個t 運算時會快很多
---
https://zhuanlan.zhihu.com/p/33307259
ECC介紹
https://medium.com/@VitalikButerin/exploring-elliptic-curve-pairings-c73c1864e627
ECC 簡單介紹 推薦
https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/
https://medium.com/@VitalikButerin/zk-snarks-under-the-hood-b33151a013f6
說到KEA 本質是運用ECC 產生的數據有乘法和加法性
KEA應該才是隱藏輸入的關鍵 可隱藏輸入的資料和計算
可以先看KEA
再看liner PCP跟liner interactive proof
https://zhuanlan.zhihu.com/p/150752963
## KEA
ECC介紹需要看一下
1.在橢圓曲線上,KEA指的是給定一個對點P, Q,其中P*k = Q,
2.然後在給定一個點C,你不可能得到一個點R = C *k
3.是在說R 不能被單被一個k回推 trapdoor特性
如同 私鑰* k = 公鑰
但你得知公鑰 不可能透過k 推出私鑰 所以k給人看無所謂
如同ECC 的 私鑰 * G = 公鑰一樣
4.除非你知道C是怎麼產生 例如從P點以某種運算導出 那自然可以透過C*k=R 順向運算OK的
以上是指數知識假設 zkSNARK的安全性依賴於這個假設 帶表安全性是基於ECC的方式隱藏輸入 因為你能簡單獲得輸出 但不能回推得到輸入
---
(P, Q)是兩個點哦 可以看成 私鑰 * G = 公鑰
G是P 公鑰是Q 私鑰是k 所以k沒人知道(代表沒人能偽造也回推不出)
文:假設現在有一對點 (P, Q) 其中 P*k = Q,沒人知道k的值是什麼,我得到這對點之後我給出一對新的點 (R, S) 並聲稱 R*k = S.
指數知識假設可以保證我能得到這對點的唯一途徑是我用點 P 和 Q 同時乘以一個只有我自己知道的值 r.通過橢圓曲線對運算的性質,
我們可以在不需要知道k的情況下驗證 R*k = S 是否成立:
e(R, Q) ?= e(P, S).
主要還是透過ECC有乘法性質來運算
k不需要知道的情況
一樣可以保證(R,S)點的正確性
因為(R,S)是透過(P,Q)* r 運算
**KEA隱藏的是多項式
應是代表(P,Q)是透過QAP的方程式轉化 方程式應該是k**
但是一樣能經過運算 無法回推 所以方程式k無從得知
---
### 可信設置
文:現在我們進一步給定十對點 (P1, Q1), (P2, Q2),...,(P10, Q10),每對點都有 Pi*k=Qi. 類似的,我給出一對新的點 (R,S) 並聲稱 R*k = S,這時可以推出我知道 R 是 P1,P2,...P10 的線性組合: P1*i1+P2*i2+...+P10*i10,S 是點 Q1,Q2,...,Q10 使用同樣係數的線性組合。我們可以使用同樣的方法來驗證 R*k = S
但最初你沒有k 是無法創建P*k=Q
所以創建k的服務必須是可信的 且一定要被刪除
這是可信裝置概念的來源
You might have noticed that the trick above works on elliptic curve points, not polynomials. Hence, what actually happens is that we add the following values to the trusted setup:
上述的原理是對於ECC的點 而不是方程式
所以會帶入祕密的點t(應該是拉格朗日的(t,0) 代表係數的階數)
將方程式轉換為ecc點 但是以下方程式的數量會隨著t變多 上述成立的話
基本上超過也沒關係 照原本的計算 如果t超過
多出來的a,b,c行補0 然後witness列補0 底下運算是不是影響的
G * A_1(t), G * A_1(t) * k_a
G * A_2(t), G * A_2(t) * k_a
……
G * B_1(t), G * B_1(t) * k_b
G * B_2(t), G * B_2(t) * k_b
……
G * C_1(t), G * C_1(t) * k_c
G * C_2(t), G * C_2(t) * k_c
1.用上述的例子(P,Q)(R,S)
左側
G = P
A_1(t) = k
P * k = Q
右側
k_a = r
Q * r = S
k就像私鑰 回推不出 也沒人知道
整個解析應是P*k -> Q , Q*r -> S
這裡應該是產生(Q,S)
這樣就能產出兩橢圓曲線上的點
且同時都是無法回推的 這樣便能保護輸入的方程式k
2.or 簡單的看成(P,Q)
k = A_1(t)
P = G*k
左側 P
Q = P * k_c
右側 Q
2可能比較對 產生點的方式比較像
---
You can think of t as a “secret point” at which the polynomial is evaluated. G is a “generator” (some random elliptic curve point that is specified as part of the protocol) and t, k_a, k_b and k_c are “toxic waste”, numbers that absolutely must be deleted at all costs, or else whoever has them will be able to make fake proofs
G就是基本點 t、k_a、k_b 和 k_c是必須刪除的
不然證明者就能任意的偽造證明
---
文:回顧一下我們剛剛講的 QAP的解是這種形式的:
A(x) * B(x) - C(x) = H(x) * Z(x).其中:
t是單純的隨機數 不是之前的方程式
A(t) * B(t) - C(t) ?= H(t) * Z(t)
我們通過橢圓曲線上的對運算進一步降低計算量,設G是橢圓曲線的生成點(基點),證明者需要給出以下證明:
**證明者主要提供的是A()方程式**
在前述的QAP有解說 透過witness跟QAP向量產生
其餘的t k_a k_b k_c都是可信設置給予的
證明者也不該知道
透過此變化原先的A()方程式就會變成ECC上的點
因其無法回推的特質 透過witness產生的QAP就會被隱藏
π_A = G * A(t),
π_A'= G * A(t)*k_a
π_B = G * B(t),
π_B'= G * B(t)*k_b
π_C = G * C(t),
π_C'= G * C(t)*k_c
π_H = G * H(t)
請注意,證明者實際上不需要知道(也不應該知道!)
t、k_a、k_b 或 k_c 來計算;相反的,證明者只能夠**僅根據我們添加到可信設置的點**來計算
## 驗證者檢查:
e是ecc 在V神ECC那篇有介紹 不過也可以將e視為單向加密
https://medium.com/@VitalikButerin/exploring-elliptic-curve-pairings-c73c1864e627
EX: e(p)= p*G = P
此處的e(P,Q)是雙線性映射
---
P= p*G, Q = q*G, R = r*G
檢查
5*p+ 7*q = 11 *r
相當於檢查
5*P+ 7*Q = 11 *R
雙線性映射例子 G可視為1 因為G是產生所有點的基點
e(P,Q)*e(G, G*5)=1
相當於
p*q + 5 = 0.
WHY
也許是因為P=p*G Q=q*G 他們有相同的乘法性質 *G
那篇ECC不好懂
e(P,Q) -> p*q
e(G, G*5) -> 1*5
e(0)*e(0) -> 0+0
---
開始檢查
A * B - C = H * Z
e(π_a, π_b) / e(π_c, G) ?= e(π_h, G * Z(t))
---
t可能是較大的隨機數
QAP產生的過程是使用拉格朗日 x=1...x=n
t也許不用固定(? 只要從小到大
A B C係數是公開的
t可能是代表電路的大小 不然拉格朗日的Z一帶進去電路不就歸0了
所以t越大 x階數就越大
基本上超過原本的向量也沒關係 照原本的計算 如果t超過
多出來的a,b,c行補0 然後witness列補0 底下運算是不是影響的
這樣Z就是(x-1)(x-2)....(x-t)
其他的方程式a,b,c也能繼續照這產生
只是進ecc時會被轉換成ecc的點
---
1. (a)部分就透過t去轉化QAP成ECC了

---
原來 power of tau 就是 CRS
在途中看到的一推E()
G * A_1(t), G * A_1(t) * k_a
G * A_2(t), G * A_2(t) * k_a
實際上是公開的 供大家取用再進行驗證
思考一下隱藏witness主要在哪裡零知識
---
透過ECC轉化後的方程式 沒有除法
CRS能給出 e(ai) e(bi) e(ci)
這是將ai bi ci投射到ECC裡面 產生兩個點 因為該點一樣具有原先的加法運算 所以可以進行驗證
p(n)=(a*s)*(b*s)-(c*s)
proof 透過*s 產生驗證的p(n)和h(n)
---
QAP最後的方程式跟帶什麼點是無關的
只要是原係數乘上s都能產生 最後的P(n) H(n)
V神那篇是說 S錯誤的狀況如果用原本的x=1,x=2,x=3去檢查 某一點會不為0(原理 但實際不會一個一個帶入)
是用P/Z會有餘數(實際會用方程式除)
但是方程式是直接透過ai bi ci的方式運算 唯一會受影響的是
---
目標大概還是要放在 HOW隱藏輸入 WHY公開驗證的過程安全
先看Groth16
再來看為何的帶入
---
QAP -> 同態隱藏 -> KCA -> Elliptic Curve Pairing/Bilinear maps
QAP是運算的格式
同時也是解答的方式
P/H 圍繞著這為核心
同態隱藏 KCA ECC等 則是為了隱藏輸入 驗證陳述不造假 同時可解答 但無法回推
https://medium.com/taipei-ethereum-meetup/%E6%B7%B1%E5%85%A5%E7%9E%AD%E8%A7%A3-zk-snarks-7a0187f399f1