arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/plonky2_verifier/fri_utils.go
plonky2_verifier/fri_utils.goRaw
  1package plonky2_verifier
  2
  3import (
  4	"gnark-ed25519/field"
  5	. "gnark-ed25519/field"
  6)
  7
  8type FriOpeningBatch struct {
  9	Values []QuadraticExtension
 10}
 11
 12type FriOpenings struct {
 13	Batches []FriOpeningBatch
 14}
 15
 16func (c *OpeningSet) ToFriOpenings() FriOpenings {
 17	values := c.Constants                         // num_constants + 1
 18	values = append(values, c.PlonkSigmas...)     // num_routed_wires
 19	values = append(values, c.Wires...)           // num_wires
 20	values = append(values, c.PlonkZs...)         // num_challenges
 21	values = append(values, c.PartialProducts...) // num_challenges * num_partial_products
 22	values = append(values, c.QuotientPolys...)   // num_challenges * quotient_degree_factor
 23	zetaBatch := FriOpeningBatch{Values: values}
 24	zetaNextBatch := FriOpeningBatch{Values: c.PlonkZsNext}
 25	return FriOpenings{Batches: []FriOpeningBatch{zetaBatch, zetaNextBatch}}
 26}
 27
 28type FriPolynomialInfo struct {
 29	OracleIndex    uint64
 30	PolynomialInfo uint64
 31}
 32
 33type FriOracleInfo struct {
 34	NumPolys uint64
 35	Blinding bool
 36}
 37
 38type FriBatchInfo struct {
 39	Point       QuadraticExtension
 40	Polynomials []FriPolynomialInfo
 41}
 42
 43type FriInstanceInfo struct {
 44	Oracles []FriOracleInfo
 45	Batches []FriBatchInfo
 46}
 47
 48func (c *CommonCircuitData) polynomialInfoFromRange(oracleIdx uint64, startPolyIdx uint64, endPolyIdx uint64) []FriPolynomialInfo {
 49	returnArr := make([]FriPolynomialInfo, 0)
 50	for i := startPolyIdx; i < endPolyIdx; i++ {
 51		returnArr = append(returnArr,
 52			FriPolynomialInfo{
 53				OracleIndex:    oracleIdx,
 54				PolynomialInfo: i,
 55			})
 56	}
 57
 58	return returnArr
 59}
 60
 61// Range of the sigma polynomials in the `constants_sigmas_commitment`.
 62func (c *CommonCircuitData) sigmasRange() []uint64 {
 63	returnArr := make([]uint64, 0)
 64	for i := c.NumConstants; i <= c.NumConstants+c.Config.NumRoutedWires; i++ {
 65		returnArr = append(returnArr, i)
 66	}
 67
 68	return returnArr
 69}
 70
 71func (c *CommonCircuitData) numPreprocessedPolys() uint64 {
 72	sigmasRange := c.sigmasRange()
 73	return sigmasRange[len(sigmasRange)-1]
 74}
 75
 76func (c *CommonCircuitData) numZSPartialProductsPolys() uint64 {
 77	return c.Config.NumChallenges * (1 + c.NumPartialProducts)
 78}
 79
 80func (c *CommonCircuitData) numQuotientPolys() uint64 {
 81	return c.Config.NumChallenges * c.QuotientDegreeFactor
 82}
 83
 84func (c *CommonCircuitData) friPreprocessedPolys() []FriPolynomialInfo {
 85	return c.polynomialInfoFromRange(
 86		CONSTANTS_SIGMAS.index,
 87		0,
 88		c.numPreprocessedPolys(),
 89	)
 90}
 91
 92func (c *CommonCircuitData) friWirePolys() []FriPolynomialInfo {
 93	numWirePolys := c.Config.NumWires
 94	return c.polynomialInfoFromRange(WIRES.index, 0, numWirePolys)
 95}
 96
 97func (c *CommonCircuitData) friZSPartialProductsPolys() []FriPolynomialInfo {
 98	return c.polynomialInfoFromRange(
 99		ZS_PARTIAL_PRODUCTS.index,
100		0,
101		c.numZSPartialProductsPolys(),
102	)
103}
104
105func (c *CommonCircuitData) friQuotientPolys() []FriPolynomialInfo {
106	return c.polynomialInfoFromRange(
107		QUOTIENT.index,
108		0,
109		c.numQuotientPolys(),
110	)
111}
112
113func (c *CommonCircuitData) friZSPolys() []FriPolynomialInfo {
114	return c.polynomialInfoFromRange(
115		ZS_PARTIAL_PRODUCTS.index,
116		0,
117		c.Config.NumChallenges,
118	)
119}
120
121func (c *CommonCircuitData) friOracles() []FriOracleInfo {
122	return []FriOracleInfo{
123		{
124			NumPolys: c.numPreprocessedPolys(),
125			Blinding: CONSTANTS_SIGMAS.blinding,
126		},
127		{
128			NumPolys: c.Config.NumWires,
129			Blinding: WIRES.blinding,
130		},
131		{
132			NumPolys: c.numZSPartialProductsPolys(),
133			Blinding: ZS_PARTIAL_PRODUCTS.blinding,
134		},
135		{
136			NumPolys: c.numQuotientPolys(),
137			Blinding: QUOTIENT.blinding,
138		},
139	}
140}
141
142func (c *CommonCircuitData) friAllPolys() []FriPolynomialInfo {
143	returnArr := make([]FriPolynomialInfo, 0)
144	returnArr = append(returnArr, c.friPreprocessedPolys()...)
145	returnArr = append(returnArr, c.friWirePolys()...)
146	returnArr = append(returnArr, c.friZSPartialProductsPolys()...)
147	returnArr = append(returnArr, c.friQuotientPolys()...)
148
149	return returnArr
150}
151
152func (c *CommonCircuitData) GetFriInstance(qeAPI *QuadraticExtensionAPI, zeta QuadraticExtension, degreeBits uint64) FriInstanceInfo {
153	zetaBatch := FriBatchInfo{
154		Point:       zeta,
155		Polynomials: c.friAllPolys(),
156	}
157
158	g := field.GoldilocksPrimitiveRootOfUnity(degreeBits)
159	zetaNext := qeAPI.MulExtension(qeAPI.FieldToQE(field.NewFieldElement(g.Uint64())), zeta)
160
161	zetaNextBath := FriBatchInfo{
162		Point:       zetaNext,
163		Polynomials: c.friZSPolys(),
164	}
165
166	return FriInstanceInfo{
167		Oracles: c.friOracles(),
168		Batches: []FriBatchInfo{zetaBatch, zetaNextBath},
169	}
170}