PLONK의 verifier algorithm을 알아보자. Verifier의 preprocessed input은 다음과 같다.
Common preprocessed input의 다항식들의 commitment + toxic waste가 G2에서 hiding된 값들로 이루어져 있다.
Verifier algorithm
Verifier algorithm의 input은 circuit의 public input (wi)i∈[n]과 πSNARK이다.
V((wi)i∈[n],πSNARK):
- ([a]1,[b]1,[c]1,[z]1,[tlo]1,[tmid]1,[thi]1,[Wζ]1,[Wζω]1)∈G19
πSNARK의 각 다항식들의 commitment가 G1의 element인지 확인
- (aˉ,bˉ,cˉ,sˉσ1,sˉσ2,zˉω)∈F6
πSNARK의 opening evaluation들이 field의 element인지 확인
- (wi)i∈[l]∈Fl
Public input들이 field의 element인지 확인
-
Prover와 동일한 방법으로 transcript로부터 challenge 값 β,γ,α,ζ,v,u 얻어냄
-
ZH(ζ) 계산
-
L1(ζ) 계산
-
PI(ζ) 계산
-
여기부터 Batched KZG를 사용하는 부분이다. πSNARK의 [Wζ]1,[Wζω]1의 형태를 떠올려보자.
Wζ=X−ζ1⎝⎜⎜⎜⎜⎜⎜⎜⎛r(X)+v(a(X)−aˉ)+v2(b(X)−bˉ)+v3(c(X)−cˉ)+v4(Sσ1(X)−sˉσ1)+v5(Sσ2(X)−sˉσ2)⎠⎟⎟⎟⎟⎟⎟⎟⎞Wζω=X−ζω(z(X)−zˉω)
ζ에서 r(X),a(X),b(X),c(X),Sσ1(X),Sσ2(X)의 evaluation proof들과 ζω에서 z(X)의 evaluation proof를 KZG로 batch verify하는 과정이 될 것이다. 먼저 step 7에서는 verifier의 scalar multiplication을 줄이기 위해 linearisation polynomial을 약간 변형한다.
r0:=PI(ζ)−L1(ζ)α2−(aˉ+βsˉσ1+γ)(bˉ+βsˉσ2+γ)(cˉ+γ)zˉω,r′(X):=r(X)−r0
역시나 처음에는 이 짓거리를 왜 하나 싶지만, 약간만 생각해 보면 r′(ζ)=r(ζ)−r0가 되고, r(ζ)=0이기 때문에 r′(ζ)=−r0를 바로 얻을 수 있기 때문이다. 다항식 하나에 대한 evaluation을 꽁으로 얻은 셈이지.
- Batched polynomial commitment의 첫 번째 부분을 계산
KZG batch verify algorithm에서 G1의 element F의 형태를 생각해 보자. Random challenge γ,γ′ power의 계수들이 각각 {cmi−fi(z)},{cmi′−fi′(z′)} 형태였다. Step 9에서는 각 다항식들의 commitment의 합부터 계산한다.
[D]1=[r′]1+u⋅[z]1
[D]1 계산은 너무 더러우므로 생략.
a(X),b(X),c(X),Sσ1(X),Sσ2(X)의 commitment는 step 10에서 계산한다. 왜 나누어져 있는지는 모르겠다.
- Full batched polynomial commitment 계산
a(X),b(X),c(X),Sσ1(X),Sσ2(X)의 commitment들까지 계산해서 [D]1에 더한다.
[F]1=[D]1+v⋅[a]1+v2⋅[b]1+v3⋅[c]1+v4⋅[Sσ1]1+v5⋅[Sσ2]1
- Group-encoded batch evaluation 계산
이제 모든 다항식들의 opening evaluation들의 random linear combination한 값을 G1으로 encoding한 [E]1을 계산한다.
[E]1=(−r0+v⋅aˉ+v2⋅bˉ+v3⋅cˉ+v4⋅sˉσ1+v5⋅sˉσ2+u⋅zˉω)⋅[1]1
- 드디어 마지막 단계... KZG batch verify algorithm의 pairing check 단계이다. Pairing check equation은 다음과 같다.
e([Wζ]1+u⋅[Wζω]1,[x]2)=e(ζ⋅[Wζ]1+uζω⋅[Wζω]1+[F]1−[E]1,[1]2)
이로써 PLONK verifier algorithm까지 모두 살펴보았다. 식이 너무 더러워서 절대 paper를 읽어보고 싶지 않았는데, 한 번 쭉 훑어보았다.
현재 research 중인 주제로 EVM 상에서 PLONK verifier를 구현하는 건데, 마지막 pairing check가 비싼 연산이라서 여러 개의 proof를 aggregation해서 한 번의 pairing check만 하도록 하는 게 중요한 포인트다.