[Note] PLONK algorithm - Prover

DoHoon Kim·2022년 10월 12일
1

PLONK

목록 보기
4/5

PLONK algorithm에서 증명하고자 하는 것은 witness들이 gate constraint와 copy constraint를 만족함을 증명하는 것이다.

먼저 circuit에 대해 다음과 같은 정보들이 주어진다.

  • 'selector' polynomials

    qM(X),qL(X),qR(X),qO(X),qC(X)q_M(X), q_L(X), q_R(X), q_O(X), q_C(X)
  • permutation polynomials

copy constraint를 나타내는 permutation σ:[3n][3n]\sigma: [3n] \rightarrow [3n]이 있을 때, 다음과 같이 permutation polynomial들이 정의된다.

Sσ1(X)=i=1nσ(i)Li(X)Sσ2(X)=i=1nσ(n+i)Li(X)Sσ3(X)=i=1nσ(2n+i)Li(X)S_{\sigma1}(X) = \sum_{i=1}^n\sigma^*(i)L_i(X) \\ S_{\sigma2}(X) = \sum_{i=1}^n\sigma^*(n+i)L_i(X) \\ S_{\sigma3}(X) = \sum_{i=1}^n\sigma^*(2n+i)L_i(X) \\

σ\sigma^*는 permutation된 결과를 multiplicative subgroup의 element로 대응시키는 함수다. PLONK의 각 wire에 [3n][3n]을 부여하는 대신, multiplicative subgroup H={1,ω,,ωn1}H= \{1, \omega, \dots, \omega^{n-1}\}HH와 서로 다른 HH의 cosets k1Hk_1 \cdot H, k2Hk_2 \cdot H의 원소들을 대응한다.

SNARK relation은 다음과 같이 정의된다.

RFl×F3nlR \sub \mathbb{F}^l \times \mathbb{F}^{3n - l}

ll은 public input의 개수, 3nl3n - l은 witness의 개수라고 생각하면 된다.

x=(wi)i[l],w=(wi)i=l+13nx = (w_i)_{i \in [l]}, w = (w_i)_{i=l+1}^{3n}

xx는 public input 값들의 쌍, ww는 witness 값들의 쌍이다. 각 값들은 field F\mathbb{F}의 원소들이다.

Relation의 witness 값들이 다음 조건을 만족해야 한다.

1.i[n]:qMiwiwn+i+qLiwi+qRiwn+i+qOiw2n+i+qCi=02.i[3n]:wi=wσ(i)1. \forall i \in [n]: \\ q_{Mi}w_iw_{n+i} + q_{Li}w_i + q_{Ri}w_{n+i} + q_{Oi}w_{2n+i} + q_{Ci} = 0 \\ 2. \forall i \in [3n]: \\ w_i = w_{\sigma(i)}

이제 PLONK protocol을 paper 그대로 쭉 따라가보자.

PLONK protocol은 Fiat-Shamir heuristic을 통해 non-interactive하게 기술될 수 있다. PLONK paper에서는 transcript를 통해 random challenge 값을 얻어낸다. Verifier는 transcript로부터 prover와 동일한 random challenge 값을 얻어낼 수 있다.

Common preprocessed input

Prover algorithm

Prover algorithm의 input은 witness 값들 (wi)i[3n](w_i)_{i \in [3n]}이다.

Round 1:

Round 1에서는 a(X),b(X),c(X)a(X), b(X), c(X)들의 commitment가 계산된다.

output: ([a]1,[b]1,[c]1)([a]_1, [b]_1, [c]_1)

Round 2:

Round 2에서는 permutation challenge β,γ\beta, \gamma를 얻어내고, permutation polynomial z(X)z(X)의 commitment가 계산된다. z(X)z(X)는 copy constraint를 만족함을 증명하는 다항식이다.

output: ([z]1)([z]_1)

Round 3:

Round 3에서는 앞서 계산된 다항식 a(X),b(X),c(X),z(X)a(X), b(X), c(X), z(X)를 이용해 gate constraint와 copy constraint를 만족하는지 검사하기 위한 quotient polynomial t(X)t(X)를 계산한다.

먼저 transcript로부터 quotient challenge α\alpha를 계산한다.

t(X)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))1ZH(X)+((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)α2ZH(X)t(X) = \\ (a(X)b(X)q_M(X) + a(X)q_L(X) + b(X)q_R(X) + c(X)q_O(X) + PI(X) + q_C(X)) {1 \over {Z_H(X)}} \\ + ((a(X) + βX + γ)(b(X) + βk_1X + γ)(c(X) + βk_2X + γ)z(X)) {\alpha \over {Z_H(X)}} \\ - ((a(X) + βS_{σ1}(X) + γ)(b(X) + βS_{σ2}(X) + γ)(c(X) + βS_{σ3}(X) + γ)z(Xω)) {\alpha \over {Z_H(X)}} \\ + (z(X) - 1)L_1(X) {\alpha^2 \over {Z_H(X)}}

매우 더럽지만, α\alpha의 차수에 대해서 생각했을 때 상수항은 gate constraint를 만족해야 함을 나타내며, 일차항은 z(X)z(X)가 multiplicative subgroup 위에서 어떻게 정의되는지를 나타내며, 이차항은 z(ω)=1z(\omega) = 1, 즉 copy constraint가 만족해야 함을 나타낸다. PLONK에서 check하려는 모든 조건이 담겨 있는 다항식임을 알 수 있다.
t(X)t(X)의 degree가 최대 3n+53n + 5일 수 있는데 srs에는 xn+5x^{n+5}까지만 준비돼 있기 때문에, t(X)t(X)를 다음과 같이 표현한다.

t(X)=tlo(X)+Xntmid(X)+x2nthi(X)t(X) = t_{lo}(X) + X^nt_{mid}(X) + x^{2n}t_{hi}(X)

tlo(X),tmid(X),thi(X)t_{lo}(X), t_{mid}(X), t_{hi}(X)에 대한 commitment를 계산한다.

output: ([tlo]1,[tmid]1,[thi]1)([t_{lo}]_1, [t_{mid}]_1, [t_{hi}]_1)

Round 4:

Round 4에서는 다항식들을 각각 특정 점에서 evaluate한다. 먼저 transcript로부터 evaluation challenge ζ\zeta를 얻어낸다. 그리고 다음과 같이 다항식들의 opening evaluation을 계산한다.

aˉ=a(ζ),bˉ=b(ζ),cˉ=c(ζ),sˉσ1=Sσ1(ζ),sˉσ2=Sσ2(ζ),zˉω=z(ζω)\bar{a} = a(\zeta), \bar{b} = b(\zeta), \bar{c} = c(\zeta), \bar{s}_{\sigma1} = S_{\sigma1}(\zeta), \bar{s}_{\sigma2} = S_{\sigma2}(\zeta), \\ \bar{z}_{\omega} = z(\zeta \omega)

output: (aˉ,bˉ,cˉ,sˉσ1,sˉσ2,zˉω)(\bar{a}, \bar{b}, \bar{c}, \bar{s}_{\sigma1}, \bar{s}_{\sigma2}, \bar{z}_{\omega})

Round 5:

Round 5가 최종 관문이다. Round 5에서는 모든 다항식들의 evaluation proof를 계산한다. 먼저 transcript로부터 opening challenge vv를 얻어낸다.

Round 3에서 계산한 quotient polynomial t(X)t(X)의 형태를 생각해 보자. 분자의 더러운 다항식들을 p(X)p(X)라고 할 때, t(X)=p(X)ZH(X)t(X) = {p(X) \over {Z_H(X)}} 형태이다. Prover가 q(X)q(X)를 알고 있음을 증명하기 위해서는 evaluation challenge에서 t(X),ZH(X),p(X)t(X), Z_H(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))r(X) = [\bar{a}\bar{b}q_M(X) + \bar{a}q_L(X) + \bar{b}q_R(X) + \bar{c}q_O(X) + PI(\zeta) + q_C(X)] \\ + \alpha[(\bar{a} + β\zeta + γ)(\bar{b} + βk_1\zeta + γ)(\bar{c} + βk_2\zeta + γ)z(X) \\ - (\bar{a} + β\bar{s}_{σ1} + γ)(\bar{b} + β\bar{s}_{σ2} + γ)(\bar{c} + βS_{σ3}(X) + γ)\bar{z}_{\omega}] \\ + \alpha^2[(z(X) - 1)L_1(\zeta)] \\ - Z_H(\zeta)(t_{lo}(X) + \zeta^n t_{mid}(X) + \zeta^{2n} t_{hi}(X))

진짜 뭔가 싶지만 t(X)=p(X)ZH(X)t(X) = {p(X) \over {Z_H(X)}}r(X)=p(X)t(X)ZH(X)r(X) = p(X) - t(X)Z_H(X) 형태로 바꾼 것 뿐이다. t(X),ZH(X),p(X)t(X), Z_H(X), p(X) 각각에 대해 evaluation proof를 만드는 대신에, r(ζ)=0r(\zeta) = 0에 대한 evaluation proof만 생성하면 된다. r(X)r(X)의 commitment는 qM(X),qL(X),qR(X),qO(X),qC(X),z(X),Sσ3(X),tlo(X),tmid(X),thi(X)q_M(X), q_L(X), q_R(X), q_O(X), q_C(X), z(X), S_{\sigma 3}(X), t_{lo}(X), t_{mid}(X), t_{hi}(X)에 대한 commitment들로 계산할 수 있다는 것이 또 다른 포인트다.

자, 이제 첫 번째 opening proof polynomial Wζ(X)W_{\zeta}(X)를 계산한다.

Wζ(X)=W_{\zeta}(X) = \\

이 다항식은 r(X),a(X),b(X),c(X),Sσ1(X),Sσ2(X)r(X), a(X), b(X), c(X), S_{\sigma1}(X), S_{\sigma2}(X)들을 ζ\zeta에서 evaluation proof들을 random linear combination한 것이다.

두 번째 opening proof polynomial Wζw(X)W_{\zeta w}(X)를 계산한다.

Wζw(X)=(z(X)zˉω)XζwW_{\zeta w}(X) = {{(z(X) - \bar{z}_{\omega})} \over {X - \zeta w}}

서로 다른 점 ζ,ζω\zeta, \zeta \omega에서 evaluate됐음을 알 수 있다. 뒤에서 Batched KZG를 쓸 예정이다.
마지막으로 opening proof polynomial들의 commitment를 계산한다.

[Wζ]1:=[Wζ(x)]1,[Wζω]1:=[Wζω(x)]1,[W_{\zeta}]_1 := [W_{\zeta}(x)]_1, [W_{\zeta \omega}]_1 := [W_{\zeta \omega}(x)]_1,

output: ([Wζ]1,[Wζω]1)([W_{\zeta}]_1, [W_{\zeta \omega}]_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)\pi_{SNARK} = ([a]_1, [b]_1, [c]_1, [z]_1, [t_{lo}]_1, [t_{mid}]_1, [t_{hi}]_1, \bar{a}, \bar{b}, \bar{c}, \bar{s}_{\sigma1}, \bar{s}_{\sigma2}, \bar{z}_{\omega}, [W_{\zeta}]_1, [W_{\zeta \omega}]_1)

그냥 각 라운드별로 계산한 output들 전부 모은 거다. 마지막으로 transcript에서 multipoint evaluation challenge uu를 얻어낸다. Batched KZG를 참고하길 바란다.

아쉽게도 모든 게 끝난 게 아니다. 다음은 Verifier algorithm을 알아보자.

profile
Researcher & Developer

0개의 댓글