arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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}