From f58e3d2f71b425f968414ab48885644af1c901f0 Mon Sep 17 00:00:00 2001 From: Insun35 Date: Sat, 20 Jul 2024 00:48:53 +0900 Subject: [PATCH] add ZK-SNARK protocols --- .../Zero Knowledge Proofs/Groth16.md | 58 +++++++++ .../Pinocchio protocol.md | 82 ++++++++++++ .../Polynomial theorem.md | 48 +++++++ .../Quadratic Arithmetic Program.md | 121 ++++++++++++++++++ 4 files changed, 309 insertions(+) create mode 100644 content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Groth16.md create mode 100644 content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Pinocchio protocol.md create mode 100644 content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Polynomial theorem.md create mode 100644 content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Quadratic Arithmetic Program.md diff --git a/content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Groth16.md b/content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Groth16.md new file mode 100644 index 0000000..6dc59e7 --- /dev/null +++ b/content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Groth16.md @@ -0,0 +1,58 @@ +## Intro + +_**Groth16**_은 Pinocchio protocol에 비해 성능을 향상시킨 시스템이다. [[Pinocchio protocol]]에 비해 훨씬 적은 수의 페어링으로도 검증이 가능하고 CRS도 더 짧다. 다만 두번의 Trusted setup을 해야한다는 치명적인 단점이 있다. + +## CRS + +- Toxic waste: $\alpha, \beta, \gamma, \delta, \tau \in F_p$ +- $Q(x) = A(x)*B(x)-C(x) =H(x)*Z(x)$ → R1CS로부터 생성된 QAP polynomial Q(x) +- $n$개의 constraints가 있고, $Z(x) = (x-1)(x-2)...(x-n)$ 이다. +- computation에 $m$개의 variable을 사용하고, 그중 public input은 $l$개이다. +- $L_i(x) = \beta *A_i(x) + \alpha *B_i(x) + C_i(x)$ + +**Proving Key:** + +$G_1$ elements: $g_1, g_1^\alpha, g_1^\beta, g_1^\delta, \{g_1^{\tau^i},g_1^{\alpha\tau^i},g_1^{\beta\tau^i}\}_{i=0}^{n-1}, \{g_1^{L_i(\tau)/\delta}\}_{i=l+1}^m, \{g^{\tau^iZ(x)/\delta}\}_{i=0}^{n-2}$ + +$G_2$ elements: $g_2, g_2^\beta, g_2^\delta, \{g_2^{\tau^i}\}_{i=0}^{n-1}$ + +**Verification Key:** + +$G_1$ elements: $g_1, \{g_1^{L_i(\tau)/\gamma}\}_0^l$ + +$G_2$ elements: $g_2, g_2^\gamma, g_2^\delta$ + +$G_T$ element: $g_1^\alpha * g_2^\beta$ + +## Proof Generation + +- witness vector $w = (1, w_1,...,w_m)$ +- 랜덤값 $r,s$ +- Proof는 세개의 점 $A, B, C$로 이루어진다. + +※ 아래 식에서 아래첨자 1 또는 2는 $G_1, G_2$를 의미한다. (e.g. $\alpha_1 = \alpha * g_1$) + +$A$는 $G_1$ 위의 점이고 다음식을 만족한다. + +$A_1 = \alpha_1 + w_0*A_0(\tau)_1 + w_1*A_1(\tau)_1+ ...+ w_m*A_m(\tau)_1+r*\delta_1$ + +$B$는 $G_2$ 위의 점이고 다음식을 만족한다. + +$B_2 = \beta_2 + w_0*B_0(\tau)_2 + w_1*B_1(\tau)_2 + ... + w_m*B_m(\tau)_2 +s*\delta_2$ + +$C$는 $G_1$ 위의 점이고 다음식을 만족한다. + +$C_1 = w_{l+1}*(L_{l+1}(\tau)/\delta)_1 +...+ w_m*(L_m(\tau)/\delta)_1 + H(\tau)*(Z(\tau)/\delta)_1 + s*A_1 + r*B_1-r_s*\delta_1$ + +## Verification + +아래 식이 성립하는지 확인함으로써 위에서 생성한 Proof를 검증할 수 있다. + +$A_1*B_2 = \alpha_1 * \beta_2 + (w_0*L_0(\tau)/\gamma+...+ w_l*L_l(\tau)/\gamma)_1 * \gamma_2 + C_1 *\delta_2$ + +이 식에서 $\alpha_1*\beta_2$는 이미 verification key 로 주어져있으므로 3개의 paring만 연산하면 된다. + +- 좌변 $A_B = (\alpha+A(\tau) +r*\delta)*(\beta+B(\tau)+s*\delta) = A(\tau)*B(\tau) + \alpha*\beta+\alpha*B(\tau)+ \beta*A(\tau) + s*\alpha*\delta+s*A(\tau)*\delta+ r*\beta*\delta+ r*B(\tau)*\delta +s*r*\delta*\delta$ +- 우변 $\alpha*\beta + L(\tau) + H(\tau)*Z(\tau) + s*\alpha*\delta + s*A(\tau)*\delta + s*r*\delta*\delta+ r*\beta*\delta + r*B(\tau)*\delta +s*_*r*_*\delta*\delta -s*_*r*_*\delta*\delta \\ = α*_*β + β*_*A(τ) + α*_*B(τ) + C(τ) + H(τ)*_*Z(τ) + s*_*α*_*δ + s*_*A(τ)*_*δ + s*_*r*_*δ *_*δ + r*_*β*_*δ + r*_*B(τ)* δ \\ = C(τ) + H(τ)*_*Z(τ) + α*_*β + α *_*B(τ) + β*_*A(τ) + s*_*α*_*δ + s*_*A(τ)*_*δ + r*_*β*_*δ + r*_*B(τ)*_* δ + s*_*r*_*δ *δ$ + +위 좌변과 우변을 전개한 결과에서 공통 인수들을 소거해보면 $A(\tau)*B(\tau) = C(\tau) +H(\tau)*Z(\tau)$ 임을 알 수 있고, 결론적으로 증명하고자 했던 식을 검증할 수 있게 된다. diff --git a/content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Pinocchio protocol.md b/content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Pinocchio protocol.md new file mode 100644 index 0000000..4a04095 --- /dev/null +++ b/content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Pinocchio protocol.md @@ -0,0 +1,82 @@ +## Intro +이 아티클은 [[ZK-SNARK]] 시스템 중 가장 먼저 실용화된 **Pinocchio protocol**에서 proof를 생성하고 검증하는 기본적인 과정을 서술하였다. + +## Homomorphic Hidings + +영지식증명 시스템에서 Prover가 증명하는 것은 보통 특정 다항식을 알고있다는 것이다. 다만, 알고있다는 사실 외에 다항식에 대한 어떠한 정보도 노출되면 안된다. + + zk-SNARK에서 다항식을 이용하는 이유 [[Polynomial theorem#2. Schwartz-Zippel Lemma]]에 의해 최대 차수가 $d$인 서로 다른 두 다항식의 교점은 최대 $d$개이다. 즉, Prover와 Verifier가 서로 다른 다항식을 가지고 있을 때 두 다항식이 겹치는 점은 최대 $d$개인 것이다. 예를들어 최대차수가 $d$인 두 다항식의 정의역의 범위가 $1**Lagrange Interpolation :** For $x_i, y_i$ with $i \in [0, n)$ and $x_i \ne x_j \; \forall \; i\ne j$, there is a unique polynomial $f$ of degree less than $n$ such that $f(x_i) = y_i \; \forall \; i \in [0,n)$ +> +→ In general case, takes $O(n\log^2n)$ via Divide & Conqure + FFT + +Let’s make Interpolated polynomials of each variables: + +$$ U(x_i) = u_i,\; V(x_i) = v_i,\; W(x_i) = w_i $$ + +In $𝔽_p$, we can use the case of $x_i = \omega^i, \; \omega^n = 1$. (→ $O(n\log n)$ via FFT) + +We can make each polynomials $U, V,W$: + +$$ U(\omega^i)= u_i,\; V(\omega^i)= u_i,\; W(\omega^i)= w_i $$ + +Now, what we gotta prove is : $U(\omega^i)*V(\omega^i)-W(\omega^i) = (x^n-1)Q(x)$ + +$\because U(\omega^i)*V(\omega^i) = W(\omega^i)$ +$U(\omega^i)*V(\omega^i)-W(\omega^i) \equiv 0 \mod{ (x-\omega^0)(x-\omega^1)...(x-\omega^{n-1})}$ +$U(\omega^i)*V(\omega^i)-W(\omega^i) \equiv 0 \mod{(x^n-1)}$ +$U(\omega^i)*V(\omega^i)-W(\omega^i) = (x^n-1)Q(x)$ + +### 2. Schwartz-Zippel Lemma +$P \in 𝔽[x_1,...,x_n]$ is a non-zero polynomial with total degree $d$ over finite field $𝔽$. If $r_1,r_2, ..., r_n$ are i.i.d. randomly selected from $𝔽$, then +$$ P_r[P(r_1,r_2,...,r_n) = 0] \le {d\over |𝔽|} $$ + +Therefore, it suffices to select random $t \in 𝔽$ and check : +$$ U(t)*V(t)-W(t) = (t^n-1)Q(t) $$ +By the way, we don’t want interactions between the prover and verifier. So, the prover gotta give the $t$ value with polynomials at once, but the prover may modify the equation which can hold the $t$ value even if it is not the identical equation. + +The verifier can convince when the prover make the $t$ value with the hash of the polynomials. +→ The probability of cheating with hash value is negligible : Fiat-Shamir heuristic + +### 3. Polynomial Commitment Schemes (PCS) + +- Commit: $f \rightarrow C(f)$ (binding and hiding, so that the verifier cannot know the exact $f$ and prover cannot change the $f$) +- Prove: Generate proof $\pi$ such that $f(x) = y$ +- Verify: Verify $f(x) =y$ given $x,y,C(f), \pi$. + +### 4. Adding ZK + +Adding random points to interpolate $U,V,W$ on, or adding random multiples of $x^n-1$ works in PLONKish. It depends on which SNARK system to use. \ No newline at end of file diff --git a/content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Quadratic Arithmetic Program.md b/content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Quadratic Arithmetic Program.md new file mode 100644 index 0000000..9cc6af1 --- /dev/null +++ b/content/Privacy Enhancing Technologies (PET)/Zero Knowledge Proofs/Quadratic Arithmetic Program.md @@ -0,0 +1,121 @@ +[[ZK-SNARK]]는 특정 다항식을 알고있음을 비대화형 영지식증명방식으로 증명하는 것인데, 증명 과정에서 Quadratic Arithmetic Program을 사용해 증명에 필요한 제약사항들을 생성할 수 있다. + +## Computation + +우선 증명하려는 computational problem을 정의해야하는데, 다음과 같은 문제를 예시로 들어보자. +$$x^3 + x + 5 = 35$$ +Prover가 이 문제의 정답을 알고 있다는 것을 증명한다고 하자. (참고로 이 문제의 정답은 3으로, 3차방정식을 풀 수 있으면 쉽게 답을 구할 수 있는 문제이지만 이해를 위해 간단한 예시를 이용한다.) 이 문제를 코드로 나타내면 다음과 같다. +```python +def qeval(x): + y = x**3 + return x + y + 5 +``` + +## Arithmetic circuit +첫 번째로 Flattening 이라는 작업을 통해 복잡한 원본 코드(computational problem)를 한번의 연산(두개의 변수와 `+, -, *` 중에 하나의 연산자)으로 구성된 순차적인 조각들로 나누게 되는데, 각각의 조각들을 **gate**라고 한다. 위 예시를 circuit으로 변환하면 다음과 같다. + +## R1CS + +다음으로 위의 circuit을 rank-1 matrix로 나타내는 R1CS(Rank-1 Constraint System)로 변환해야한다. R1CS는 세개의 벡터 그룹 `(a, b, c)` 와 솔루션 벡터 `s`로 이루어진 방정식 `s・a * s・b - s・c = 0` 이다. + +각 벡터(a, b, c)에는 circuit에서 생성된 변수들을 원소로 할당한다. 위 예시에서는 `'~one', 'x', 'out', 'sym_1', 'y', 'sym_2'` 이렇게 6개의 원소로 변수를 매핑한다.(’~one’은 상수 1) + +그리고 솔루션 벡터에는 이 조건식을 만족시키는 assignment로 구성된다. + +`sym_1 = x * x` 를 예로 들면 `x * x - sym_1 = 0` 로 a * b - c = 0 꼴로 바꿀 수 있고 a = x, b = x, c = sym_1 이다. 따라서 다음과 같이 변환할 수 있다. + +```jsx +a = [0, 1, 0, 0, 0, 0] // x +b = [0, 1, 0, 0, 0, 0] // x +c = [0, 0, 0, 1, 0, 0] // sym_1 +``` + +예를들어 벡터를 `['~one', 'x', 'out', 'sym_1', 'y', 'sym_2']` 로 매핑하면 a는 1x에 해당하므로 [0, 1, 0, 0, 0, 0]으로 나타낼 수 있다. + +같은 방식으로 위의 gate들을 변환하면 다음과 같다: + +1. `sym_1 = x * x` + + ```jsx + a = [0, 1, 0, 0, 0, 0] // x + b = [0, 1, 0, 0, 0, 0] // x + c = [0, 0, 0, 1, 0, 0] // sym_1 + ``` + +2. `y = sym_1 * x` + + ```jsx + a = [0, 0, 0, 1, 0, 0] // sym_1 + b = [0, 1, 0, 0, 0, 0] // x + c = [0, 0, 0, 0, 1, 0] // y + ``` + +3. `sym_2 = y + x` + + ```jsx + a = [0, 1, 0, 0, 1, 0] // y + x + b = [1, 0, 0, 0, 0, 0] // 1 + c = [0, 0, 0, 0, 0, 1] // sym_2 + ``` + +4. `~out = sym_2 + 5` + + ```jsx + a = [5, 0, 0, 0, 0, 1] // sym_2 + 5 + b = [1, 0, 0, 0, 0, 0] // 1 + c = [0, 0, 1, 0, 0, 0] // ~out + ``` + + +최종적으로 R1CS는 다음과 같다. + +```jsx +**A // 'a' vectors +[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 // 'b' vectors +[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 // 'c' vectors +[0, 0, 0, 1, 0, 0] +[0, 0, 0, 0, 1, 0] +[0, 0, 0, 0, 0, 1] +[0, 0, 1, 0, 0, 0] +``` + +그리고 A,B,C 행렬에 대해 다음을 만족하는 $s$가 적절한 assignment가 된다. (○으로 표시된 연산은 Hadamard product이다.) + +$(A・s) ◦(B・s)-(C・s) = \begin{bmatrix}0\\0\\0\\0\end{bmatrix}$ + +$s$가 될 수 있는 경우의 수는 많지만 `~out` 이 35가 되게 하려면 $s = \begin{bmatrix}1\\3\\35\\9\\27\\30\end{bmatrix}$이다. + +## QAP + +위에서 살펴본 예시는 R1CS로도 간단한 연산이 가능하지만 circuit의 크기가 커지면 constraint의 개수도 그만큼 증가하게 되고 연산이 복잡해지게 된다. + +Quadratic Arithmetic Program(QAP)은 R1CS의 각각의 constraint들을 한번에 다룰수 있는 다항식을 생성한다. 즉, R1CS의 변수들로 매핑된 각각의 함수에 $n$을 대입하면 n번째 gate의 해당 값이 나오는 다항식들로 변환하는 것이다. R1CS를 QAP로 변환하면 다음과 같다. + +```python +A = [A_1(x), A_2(x), A_3(x), A_4(x), A_5(x), A_6(x)] +B = [B_1(x), B_2(x), B_3(x), B_4(x), B_5(x), B_6(x)] +C = [C_1(x), C_2(x), C_3(x), C_4(x), C_5(x), C_6(x)] +``` + +예를들어 $A_2(x)$ 라는 다항식에 3을 대입하면 두번째 값(`x`)의 세번째 gate의 값인 1이 나오게 되고 4를 대입하면 네번째 값인 0이 나오게 된다.($A_2(3) = 1, A_2(4)= 0$) + +따라서 $A・s = A(x), \; B・s = B(x), \; C・s =C(x)$ 라고 하면, $x = 1,2,3,4$ 일때 $A(x)*B(x) -C(x) = 0$ 을 만족한다. + +여기서 주목할 점은 $Q(x) = A(x)*B(x) -C(x)$ 라고 하면, $Q(x)$의 해가 1,2,3,4라는 것은 다항식$Q(x)$에 $Z(x) = (x-1)(x-2)(x-3)(x-4)$ 가 인수로 포함되어있다는 것이다. + +따라서 R1CS의 constraint들을 각각 확인하는 문제에서 $Z(x)|Q(x)$ 를 확인하는 것으로 훨씬 간결하게 바뀌었다. + +위의 일련의 과정들이 QAP를 통해 R1CS 형태의 생성하는 프로세스이다. + +>Lagrange interpolation +$n$개의 점을 지나는 $d