# Polynomial Commitment Scheme ## 목적 Verifier는 Prover가 알고 있는 다항식 p를 특정 점에서 평가한 값, p(z)를 알고 싶다. 그런데 다항식 p를 숨기면서 p(z) = 4 라고 알려주면 맞는지 틀린지 알 수가 없다. 따라서 다항식 p를 Prover 마음대로 바꿀 수 없게 고정하는 장치가 필요하고 이것이 Polynomial Commitment Scheme이다. ### Trivial polynomial commitment scheme Prover가 p의 모든 계수를 Verifier에게 보내주면 Verifier는 p(z)를 직접 계산할 수 있다. 하지만 문제가 있다. - not succinct: 다항식의 차수와 commitment의 크기는 linear 관계이다. - linear verification time: verifier는 다항식을 직접 계산해야한다. - breaks zkness: 다항식 자체를 알게 된다. 우리가 살펴볼 scheme들은 아래의 개선이 있다. - compressing: 다항식 계수 전체보다 commitment size는 작고 verification time도 감소한다. - computationally binding: p(z)를 물어봤을 때 정말 polynomial을 아는 경우에만 “efficiently” 증명 생성이 가능. - “efficiently”: 보통 linear 이하의 시간 의미. discrete logarithm problem을 풀거나 hash collision을 찾아 증명을 생성하는 것을 제외하기 위함. - hiding: 다항식 자체는 공개하지 않거나 영지식성을 보장한다. (ProofsArgsAndZK Ch14 207p) ## 성질 해당 commitment scheme이 다룰 수 있는 다항식 차수의 upper bound를 m이라고 하자. m은 준비된 trusted setup에 의해 결정된다. - **binding**: commit 한 뒤 open하는 값은 반드시 다항식 p(x) 위의 한 점이다. - **succinct**: The number of bits of commitment ≤ *log*(*m*)^*k* - **hiding:** opening the committed polynomial at no more than *m* points doesn’t reveal any extra information about the polynomial (moonmath) ## 단계 1. setup 2. commit 1. Prover가 다항식을 바꿀 수 없게 p(x)의 commitment를 보낸다. 3. open 1. Verifier는 특정 x좌표 z에서의 다항식 값 p(z)를 보내라고 요청한다. 2. Verifier는 Prover가 아무 값이나 보낸 것이 아니라 정직하게 함수 p(z) 값을 주었는지 commitment를 이용해 확인한다. ![https://o1-labs.github.io/proof-systems/plonk/polynomial_commitments.html](https://o1-labs.github.io/proof-systems/img/polycom.png) https://o1-labs.github.io/proof-systems/plonk/polynomial_commitments.html ## 종류 ![https://www.youtube.com/live/CsNoMKSh2e8?si=QJ9wlFge4p6F6RrT&t=1720](https://hackmd.io/_uploads/H179Ucsp2.png) https://www.youtube.com/live/CsNoMKSh2e8?si=QJ9wlFge4p6F6RrT&t=1720 1. Pairing-based 1. 예시: KZG 2. Trusted setup 필요 3. elliptic curve, discrete logarithm problem 사용 2. IPA 1. 예시: Halo2 2. elliptic curve, discrete logarithm problem 사용. 3. https://arnaucube.com/blog/ipa.html 3. FRI 1. 예시: STARK 2. Trusted setup 필요 없음 3. discrete logarithm problem 사용 안 함. hash 함수 기반이므로 양자컴퓨팅으로부터 안전 오늘은 KZG만 다루자. ## Kate commitment - Groth16, PLONK에서 사용됨. - 최초 논문에서는 G_1 = G_2인 symmetric pairing이 사용되었으나 흔히 asymmetric pairing을 사용. - 장점: 증명 크기가 제일 작음. - 몇차 다항식인지 관계없이 한 점을 지난다는 것을 one group element로 증명. BLS12_381 기준 48 bytes. - 단점: Trusted setup. - 보완: 여러 명이 돌아가면서 $\{ 1, \tau g, \tau^2 g \}$ 를 $\{ 1, s (\tau g), s^2(\tau^2 g)$ 로 만듦으로써 $\tau = \tau \cdot s$ 로 업데이트. 한 명만 자신의 s값을 숨기면 최종 $\tau$ 를 알 수 없음. KZG ceremony에서 쓰인 방식. Trusted setup에서 $g_1, \tau g_1,... , \tau^k g_1$을 준비하면, $P(x) = a_k x^k + a_{k-1}x^{k-1} + ... + a_1x + a_0$ 의 commitment C는 아래처럼 계산한다. $$ C = P(\tau) g \\ = (a_k \tau^k + a_{k-1}\tau^{k-1} + ... + a_1\tau + a_0)g \\ = a_k (\tau^kg) + a_{k-1}(\tau^{k-1}g) + ... + a_1(\tau g) + a_0g $$ ### 증명 과정 p(z) = y 를 증명한다고 해보자. 표기 $e([a]_1, [b]_2) = e(G, H)^{ab} = [ab]_T$ $[a]_1 = aG, [b]_2 = bH$ 과정 1. s는 trusted setup의 secret. s 는 toxic waste로 버리고 $G, [s]_1 = sG, [s^2]_1 =s^2G, ..., [s^m]_1 = s^nG$ 와 $[s]_2 = sH, ..., [s^m]_2 = s^mH$ 이 Trusted setup으로 공개된다. n은 다항식 p로 사용 가능한 최대 차수, m은 한 번에 증명 가능한 점의 개수를 제한한다. 2. Prover는 the commitment of the polynomial p(x) $C = [p(s)]_1$ 를 보낸다. 1. 예시: $p(x) = ax + b$ 라면, $[p(s)]=[as + b] = a(sG) + b(G)$ 3. Verifier는 p(x) 값 계산이 필요한 랜덤 x 좌표, 즉 z 를 보낸다. 4. Prover는 $\pi = [q(s)]_1$ 와 계산값 p(z) (또는 y) 를 보낸다. 1. q(x): 다항식 나눗셈의 몫. 2. p(z) = y 를 증명하다면, $p(x) - y = q(x)(x - z)$ 5. Verifier는 이 등식의 성립 여부를 확인한다. $e(\pi, [s - z]_2) = e(C - [y]_1, H)$ 1. Schwartz-zippel lemma를 사용해서 x=s 에서만 $p(x) - y = q(x)(x - z)$ 의 성립을 확인함으로써 양변이 정의역 전체에서 같음을 증명한다. Verifier의 검증 방법 풀이 $$ \begin{aligned} e([q(s)]_1, [s]_2 - [z]_2) &= e([p(s)]_1 - [y]_1, H) \\ e([q(s)]_1, [s - z]_2) &= e([p(s) - y]_1, H) \\ e(G, H)^{q(s)(s-z)} &= e(G,H)^{p(s) - y} \end{aligned} $$ 예시 $p(x) = x^2 + 3x$ 라고 하자 z = 3 이면, $p(x) - p(3) = q(x)(x - 3)$ 이므로 $x^2 + 3x - (3^2 + 3 \cdot 3) = q(x)(x-3)$ 따라서, q(x) = x + 6 이고 $\pi = [q(s)]_1 = [s + 6]_1 = (s+6)G = sG + 6G$ 로 Trusted setup을 이용해 계산 가능. ### Correctness 절차를 따르면 통과하는 증명을 만들 수 있음 → 위에서 증명 & 검증 과정을 보였으므로 만족. ### Binding 만약 Prover가 p(3) = 4 라고 증명하려고 하면 다항식이 나눠떨어지지 않는다. $$ x^2 + 3x - 4/ (x - 3) = (x-1)(x+4) / (x -3) $$ $(s - z)G$ 는 Prover도 아는 값. 여기서 $\frac{1}{(s -z)}G$ 도 구할 수 있는지가 중요. 이를 D-strong Diffie-Hellman (SDH) assumption 이라고 부른다. > *D-strong Diffie-Hellman (SDH) assumption*, that essentially just asserts that “dividing in the exponent” by τ − *z* is intractable (ProofsArgsAndZK Ch15.2 233p) > 이 가정은 discrete logarithm problem이 어려움을 전제한다. 만약 (s-z)G 에서 (s-z)를 구할 수 있다면 곱셈의 역수를 구하는 ax = 1 mod p 문제는 Extended Euclidean algorithm으로 풀 수 있다. 따라서 $1/(s-z), \frac{1}{(s -z)}G$ 의 순서로 계산 가능하다. **Extended Euclidean algorithm** a,b가 주어졌을 때 ax + py = gcd(a, p) 를 만족하는 정수 x, y를 계산해주는 알고리즘. p가 소수이면 gcd(a, p) = 1 이므로 ax = 1 mod p를 계산해주는데 사용할 수 있다. 직관적 이해: 등장하는 모든 수들을 ax + py 형태로 표현해서 마지막 gcd(a, p)까지 도달한다. ![Extended Euclidean algorithm](https://hackmd.io/_uploads/B1PfrUnp3.png) https://www.youtube.com/watch?v=IwRtISxAHY4 **만약 s가 유출된다면?** s = 4 라는 사실을 Prover가 알고 있다고 가정해보자. $p(4) = 4^2 + 3*4 = 28$ 현재, $C = p(4) \cdot G = 28G$ 라는 commitment는 Verifier가 알고 있다. 악의적 증명자는 p(s) - y = q(s)(s-z) 만 만족하면 되기 때문에 28 - y = q(4) 를 만족하도록 q(4)를 설정한다면 원하는 대로 y값을 증명할 수 있다. 예를 들어 y = 10 을 원하면 [q(4)]_1 = 18G를 같이 보내주면 검증자는 p(4) - 10 = q(4)(4 - 3) 을 확인하고 통과시킨다. 즉, p(x) 를 지나지 않는 점을 verifier에게 보낼 수 있게 된다. Not binding! ### ZKness 위의 polynomial commitment scheme은 p(z) 값이 공개되는 것이라 완벽히 영지식은 아니다. 따라서 사용할 때 blinding factor라는 Prover만 아는 값을 추가함으로써 영지식성을 보장한다. ### The Power Knowledge of Exponent (PKoE) assumption - The Power Knowledge of Coefficient assumption 이라고도 부름. - Trusted setup에 Verifier만 아는 상수 $\alpha$ 배한 원소들을 추가. - p(x) 가 다항식임을 보장하기 위함. - proof와 $\alpha$ 배한 proof 두 개를 보내기를 요청. - groth16에서는 이걸 안 해도 되게 만들어서 증명 개수를 피노키오의 12개에서 3개로 줄임. (조사 필요) 참고 - ProofsArgsAndZK 234p. An extractable scheme 파트 - https://electriccoin.co/blog/snark-explain3/ ## Multiproof 두 점을 지난다는 것을 증명하려면? 방법1. 한 점을 지난다는 증명을 2번 한다. 방법2. $x = z_0$ 일 때 $y_0, x=z_1$일 때 $y_1$ 인 다항식과 $(z_0, y_0), (z_1, y_1)$ 에서 만난다고 한 번 증명 과정 1. 분자는 Lagrange interpolation 한 다항식으로 빼고 2. 분모는 지나는 점들을  $(x - z_0)…(x - z_{k - 1})$ 으로 나눠 떨어짐을 보여 증명할 수 있음. $$ \begin{aligned} I(X) &= \sum_{i=0}^{k-1} y_i \prod_{j=0 \atop j \neq i}^{k-1} \frac{X-z_j}{z_i-z_j} \\ Z(X) &= (X-z_0) \cdot (X-z_1) \cdots (X-z_{k-1}) \end{aligned} $$ 한 점을 지난다는 증명과 유사하게 다항식 나눗셈의 몫 q(x) 를 구하자. $$ q(X) = \frac{p(X) - I(X)}{Z(X)} $$ 이를 x=s에서 평가한 q(s)를 타원곡선의 generator에 곱해서 증명을 생성한다. 즉 $\pi = [q(s)]_1$. 장점: 여러 점을 지남도 one group element(타원곡선 위의 점 하나), 48 byte로 증명. 예시 ![Multiproof](https://hackmd.io/_uploads/BJF6vqiTh.png) QAP에서 제약식의 개수가 곧 증명할 점의 개수가 되므로 여러 점을 한 번에 증명하기 위해 사용된다. ![QAP](https://hackmd.io/_uploads/BkBjgm3Tn.png) ### 참고 - ProofsArgsAndZK Ch14 207p, Ch15.2 - https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html - https://cryptologie.net/article/525/pairing-based-polynomial-commitments-and-kate-polynomial-commitments/