gnark-plonky2-verifier/plonky2_verifier/plonk.go
plonky2_verifier/plonk.goRaw
1package plonky2_verifier
2
3import (
4 . "gnark-ed25519/field"
5
6 "github.com/consensys/gnark/frontend"
7)
8
9type PlonkChip struct {
10 api frontend.API
11 field frontend.API
12 qe *QuadraticExtensionAPI
13
14 commonData CommonCircuitData
15 proofChallenges ProofChallenges
16 openings OpeningSet
17}
18
19func (p *PlonkChip) expPowerOf2Extension(x QuadraticExtension) QuadraticExtension {
20 for i := uint64(0); i < p.commonData.DegreeBits; i++ {
21 x = p.qe.SquareExtension(x)
22 }
23
24 return x
25}
26
27func (p *PlonkChip) evalL0(x QuadraticExtension, xPowN QuadraticExtension) QuadraticExtension {
28 // L_0(x) = (x^n - 1) / (n * (x - 1))
29 eval_zero_poly := p.qe.SubExtension(
30 xPowN,
31 p.qe.ONE,
32 )
33 denominator := p.qe.SubExtension(
34 p.qe.ScalarMulExtension(x, p.qe.DEGREE_BITS_F),
35 p.qe.DEGREE_BITS_QE,
36 )
37 return p.qe.DivExtension(
38 eval_zero_poly,
39 denominator,
40 )
41}
42
43func (p *PlonkChip) checkPartialProductsCircuit(
44 numerators []QuadraticExtension,
45 denominators []QuadraticExtension,
46 challengeNum uint64) []QuadraticExtension {
47
48 productAccs := make([]QuadraticExtension, p.commonData.NumPartialProducts+2)
49 productAccs = append(productAccs, p.openings.PlonkZs[challengeNum])
50 productAccs = append(productAccs, p.openings.PartialProducts[challengeNum*p.commonData.NumPartialProducts:(challengeNum+1)*p.commonData.NumPartialProducts]...)
51 productAccs = append(productAccs, p.openings.PlonkZsNext[challengeNum])
52
53 partialProductChecks := make([]QuadraticExtension, p)
54
55 for i := uint64(0); i < numPartialProducts; i += 1 {
56 ppStartIdx := i * p.commonData.QuotientDegreeFactor
57 numeProduct := numerators[ppStartIdx]
58 denoProduct := denominators[ppStartIdx]
59 for j := uint64(1); j < p.commonData.QuotientDegreeFactor; j++ {
60 numeProduct = p.qe.MulExtension(numeProduct, numerators[ppStartIdx+j])
61 denoProduct = p.qe.MulExtension(denoProduct, denominators[ppStartIdx+j])
62 }
63
64 partialProductCheck := p.qe.SubExtension(
65 p.qe.MulExtension(productAccs[i], numeProduct),
66 p.qe.MulExtension(productAccs[i+1], denoProduct),
67 )
68
69 partialProductChecks = append(partialProductChecks, partialProductCheck)
70 }
71
72 return partialProductChecks
73}
74
75func (p *PlonkChip) evalVanishingPoly() []QuadraticExtension {
76 // Calculate the k[i] * x
77 s_ids := make([]QuadraticExtension, p.commonData.Config.NumRoutedWires)
78
79 for i := uint64(0); i < p.commonData.Config.NumRoutedWires; i++ {
80 p.qe.ScalarMulExtension(p.proofChallenges.PlonkZeta, p.commonData.KIs[i])
81 }
82
83 // Calculate zeta^n
84 zeta_pow_n := p.expPowerOf2Extension(p.proofChallenges.PlonkZeta)
85
86 // Calculate L_0(zeta)
87 l_0_zeta := p.evalL0(p.proofChallenges.PlonkZeta, zeta_pow_n)
88
89 vanishing_z1_terms := make([]QuadraticExtension, p.commonData.Config.NumChallenges)
90 numerator_values := make([]QuadraticExtension, p.commonData.Config.NumChallenges*p.commonData.Config.NumRoutedWires)
91 denominator_values := make([]QuadraticExtension, p.commonData.Config.NumChallenges*p.commonData.Config.NumRoutedWires)
92 for i := uint64(0); i < p.commonData.Config.NumChallenges; i++ {
93 // L_0(zeta) (Z(zeta) - 1) = 0
94 z1_term := p.qe.SubExtension(
95 p.qe.MulExtension(l_0_zeta, p.openings.PlonkZs[i]),
96 l_0_zeta,
97 )
98 vanishing_z1_terms = append(vanishing_z1_terms, z1_term)
99
100 for j := uint64(0); j < p.commonData.Config.NumRoutedWires; j++ {
101 // The numerator is `beta * s_id + wire_value + gamma`, and the denominator is
102 // `beta * s_sigma + wire_value + gamma`.
103 wire_value_plus_gamma := p.qe.AddExtension(p.openings.Wires[j], p.proofChallenges.FriChallenges.FriBetas[i])
104 numerator := p.qe.AddExtension(
105 p.qe.MulExtension(
106 p.proofChallenges.FriChallenges.FriBetas[i],
107 s_ids[j],
108 ),
109 wire_value_plus_gamma,
110 )
111
112 denominator := p.qe.AddExtension(
113 p.qe.MulExtension(
114 p.proofChallenges.FriChallenges.FriBetas[i],
115 p.openings.PlonkSigmas[j],
116 ),
117 wire_value_plus_gamma,
118 )
119
120 numerator_values = append(numerator_values, numerator)
121 denominator_values = append(denominator_values, denominator)
122 }
123 }
124
125}
126
127func (p *PlonkChip) Verify() {
128 zeta_pow_deg := p.expPowerOf2Extension(p.proofChallenges.PlonkZeta)
129 p.evalVanishingPoly(p.proofChallenges.PlonkZeta, zeta_pow_deg)
130
131 vanishingZTerms := make(F, commonData.Config.NumChallenges)
132
133 for i := 0; i < int(commonData.Config.NumChallenges); i++ {
134
135 }
136}