PLONK algorithm에서 증명하고자 하는 것은 witness들이 gate constraint와 copy constraint를 만족함을 증명하는 것이다.
먼저 circuit에 대해 다음과 같은 정보들이 주어진다.
-
'selector' polynomials
qM(X),qL(X),qR(X),qO(X),qC(X)
-
permutation polynomials
copy constraint를 나타내는 permutation σ:[3n]→[3n]이 있을 때, 다음과 같이 permutation polynomial들이 정의된다.
Sσ1(X)=i=1∑nσ∗(i)Li(X)Sσ2(X)=i=1∑nσ∗(n+i)Li(X)Sσ3(X)=i=1∑nσ∗(2n+i)Li(X)
σ∗는 permutation된 결과를 multiplicative subgroup의 element로 대응시키는 함수다. PLONK의 각 wire에 [3n]을 부여하는 대신, multiplicative subgroup H={1,ω,…,ωn−1}와 H와 서로 다른 H의 cosets k1⋅H, k2⋅H의 원소들을 대응한다.
SNARK relation은 다음과 같이 정의된다.
R⊂Fl×F3n−l
l은 public input의 개수, 3n−l은 witness의 개수라고 생각하면 된다.
x=(wi)i∈[l],w=(wi)i=l+13n
x는 public input 값들의 쌍, w는 witness 값들의 쌍이다. 각 값들은 field F의 원소들이다.
Relation의 witness 값들이 다음 조건을 만족해야 한다.
1.∀i∈[n]:qMiwiwn+i+qLiwi+qRiwn+i+qOiw2n+i+qCi=02.∀i∈[3n]:wi=wσ(i)
이제 PLONK protocol을 paper 그대로 쭉 따라가보자.
PLONK protocol은 Fiat-Shamir heuristic을 통해 non-interactive하게 기술될 수 있다. PLONK paper에서는 transcript를 통해 random challenge 값을 얻어낸다. Verifier는 transcript로부터 prover와 동일한 random challenge 값을 얻어낼 수 있다.
Prover algorithm
Prover algorithm의 input은 witness 값들 (wi)i∈[3n]이다.
Round 1:
Round 1에서는 a(X),b(X),c(X)들의 commitment가 계산된다.
output: ([a]1,[b]1,[c]1)
Round 2:
Round 2에서는 permutation challenge β,γ를 얻어내고, permutation polynomial z(X)의 commitment가 계산된다. z(X)는 copy constraint를 만족함을 증명하는 다항식이다.
output: ([z]1)
Round 3:
Round 3에서는 앞서 계산된 다항식 a(X),b(X),c(X),z(X)를 이용해 gate constraint와 copy constraint를 만족하는지 검사하기 위한 quotient polynomial t(X)를 계산한다.
먼저 transcript로부터 quotient challenge α를 계산한다.
t(X)는 다음과 같이 계산된다.
t(X)=(a(X)b(X)qM(X)+a(X)qL(X)+b(X)qR(X)+c(X)qO(X)+PI(X)+qC(X))ZH(X)1+((a(X)+βX+γ)(b(X)+βk1X+γ)(c(X)+βk2X+γ)z(X))ZH(X)α−((a(X)+βSσ1(X)+γ)(b(X)+βSσ2(X)+γ)(c(X)+βSσ3(X)+γ)z(Xω))ZH(X)α+(z(X)−1)L1(X)ZH(X)α2
매우 더럽지만, α의 차수에 대해서 생각했을 때 상수항은 gate constraint를 만족해야 함을 나타내며, 일차항은 z(X)가 multiplicative subgroup 위에서 어떻게 정의되는지를 나타내며, 이차항은 z(ω)=1, 즉 copy constraint가 만족해야 함을 나타낸다. PLONK에서 check하려는 모든 조건이 담겨 있는 다항식임을 알 수 있다.
t(X)의 degree가 최대 3n+5일 수 있는데 srs에는 xn+5까지만 준비돼 있기 때문에, t(X)를 다음과 같이 표현한다.
t(X)=tlo(X)+Xntmid(X)+x2nthi(X)
tlo(X),tmid(X),thi(X)에 대한 commitment를 계산한다.
output: ([tlo]1,[tmid]1,[thi]1)
Round 4:
Round 4에서는 다항식들을 각각 특정 점에서 evaluate한다. 먼저 transcript로부터 evaluation challenge ζ를 얻어낸다. 그리고 다음과 같이 다항식들의 opening evaluation을 계산한다.
aˉ=a(ζ),bˉ=b(ζ),cˉ=c(ζ),sˉσ1=Sσ1(ζ),sˉσ2=Sσ2(ζ),zˉω=z(ζω)
output: (aˉ,bˉ,cˉ,sˉσ1,sˉσ2,zˉω)
Round 5:
Round 5가 최종 관문이다. Round 5에서는 모든 다항식들의 evaluation proof를 계산한다. 먼저 transcript로부터 opening challenge v를 얻어낸다.
Round 3에서 계산한 quotient polynomial t(X)의 형태를 생각해 보자. 분자의 더러운 다항식들을 p(X)라고 할 때, t(X)=ZH(X)p(X) 형태이다. Prover가 q(X)를 알고 있음을 증명하기 위해서는 evaluation challenge에서 t(X),ZH(X),p(X)를 각각 계산한 값들을 전달하면 된다. 총 3개의 field element를 전달해야 한다.
PLONK paper에서는 다항식을 open할 때 Prover가 전달해야 하는 field element의 개수를 줄이기 위해 linearisation polynomial을 만든다.
Linearisation polynomial은 다음과 같이 정의된다.
r(X)=[aˉbˉqM(X)+aˉqL(X)+bˉqR(X)+cˉqO(X)+PI(ζ)+qC(X)]+α[(aˉ+βζ+γ)(bˉ+βk1ζ+γ)(cˉ+βk2ζ+γ)z(X)−(aˉ+βsˉσ1+γ)(bˉ+βsˉσ2+γ)(cˉ+βSσ3(X)+γ)zˉω]+α2[(z(X)−1)L1(ζ)]−ZH(ζ)(tlo(X)+ζntmid(X)+ζ2nthi(X))
진짜 뭔가 싶지만 t(X)=ZH(X)p(X)를 r(X)=p(X)−t(X)ZH(X) 형태로 바꾼 것 뿐이다. t(X),ZH(X),p(X) 각각에 대해 evaluation proof를 만드는 대신에, r(ζ)=0에 대한 evaluation proof만 생성하면 된다. r(X)의 commitment는 qM(X),qL(X),qR(X),qO(X),qC(X),z(X),Sσ3(X),tlo(X),tmid(X),thi(X)에 대한 commitment들로 계산할 수 있다는 것이 또 다른 포인트다.
자, 이제 첫 번째 opening proof polynomial Wζ(X)를 계산한다.
Wζ(X)=
이 다항식은 r(X),a(X),b(X),c(X),Sσ1(X),Sσ2(X)들을 ζ에서 evaluation proof들을 random linear combination한 것이다.
두 번째 opening proof polynomial Wζw(X)를 계산한다.
Wζw(X)=X−ζw(z(X)−zˉω)
서로 다른 점 ζ,ζω에서 evaluate됐음을 알 수 있다. 뒤에서 Batched KZG를 쓸 예정이다.
마지막으로 opening proof polynomial들의 commitment를 계산한다.
[Wζ]1:=[Wζ(x)]1,[Wζω]1:=[Wζω(x)]1,
output: ([Wζ]1,[Wζω]1)
PLONK prover algorithm의 결과는 다음과 같다.
πSNARK=([a]1,[b]1,[c]1,[z]1,[tlo]1,[tmid]1,[thi]1,aˉ,bˉ,cˉ,sˉσ1,sˉσ2,zˉω,[Wζ]1,[Wζω]1)
그냥 각 라운드별로 계산한 output들 전부 모은 거다. 마지막으로 transcript에서 multipoint evaluation challenge u를 얻어낸다. Batched KZG를 참고하길 바란다.
아쉽게도 모든 게 끝난 게 아니다. 다음은 Verifier algorithm을 알아보자.