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
 18	values = append(values, c.PlonkSigmas...)
 19	values = append(values, c.Wires...)
 20	values = append(values, c.PlonkZs...)
 21	values = append(values, c.PartialProducts...)
 22	values = append(values, c.QuotientPolys...)
 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
 62// Range of the sigma polynomials in the `constants_sigmas_commitment`.
 63func (c *CommonCircuitData) sigmasRange() []uint64 {
 64	returnArr := make([]uint64, 0)
 65	for i := c.NumConstants; i <= c.NumConstants+c.Config.NumRoutedWires; i++ {
 66		returnArr = append(returnArr, i)
 67	}
 68
 69	return returnArr
 70}
 71
 72func (c *CommonCircuitData) numPreprocessedPolys() uint64 {
 73	sigmasRange := c.sigmasRange()
 74	return sigmasRange[len(sigmasRange)-1]
 75}
 76
 77func (c *CommonCircuitData) numZSPartialProductsPolys() uint64 {
 78	return c.Config.NumChallenges * (1 + c.NumPartialProducts)
 79}
 80
 81func (c *CommonCircuitData) numQuotientPolys() uint64 {
 82	return c.Config.NumChallenges * c.QuotientDegreeFactor
 83}
 84
 85func (c *CommonCircuitData) friPreprocessedPolys() []FriPolynomialInfo {
 86	return c.polynomialInfoFromRange(
 87		CONSTANTS_SIGMAS.index,
 88		0,
 89		c.numPreprocessedPolys(),
 90	)
 91}
 92
 93func (c *CommonCircuitData) friWirePolys() []FriPolynomialInfo {
 94	numWirePolys := c.Config.NumWires
 95	return c.polynomialInfoFromRange(WIRES.index, 0, numWirePolys)
 96}
 97
 98func (c *CommonCircuitData) friZSPartialProductsPolys() []FriPolynomialInfo {
 99	return c.polynomialInfoFromRange(
100		ZS_PARTIAL_PRODUCTS.index,
101		0,
102		c.numZSPartialProductsPolys(),
103	)
104}
105
106func (c *CommonCircuitData) friQuotientPolys() []FriPolynomialInfo {
107	return c.polynomialInfoFromRange(
108		QUOTIENT.index,
109		0,
110		c.numQuotientPolys(),
111	)
112}
113
114func (c *CommonCircuitData) friZSPolys() []FriPolynomialInfo {
115	return c.polynomialInfoFromRange(
116		ZS_PARTIAL_PRODUCTS.index,
117		0,
118		c.Config.NumChallenges,
119	)
120}
121
122func (c *CommonCircuitData) friOracles() []FriOracleInfo {
123	return []FriOracleInfo{
124		{
125			NumPolys: c.numPreprocessedPolys(),
126			Blinding: CONSTANTS_SIGMAS.blinding,
127		},
128		{
129			NumPolys: c.Config.NumWires,
130			Blinding: WIRES.blinding,
131		},
132		{
133			NumPolys: c.numZSPartialProductsPolys(),
134			Blinding: ZS_PARTIAL_PRODUCTS.blinding,
135		},
136		{
137			NumPolys: c.numQuotientPolys(),
138			Blinding: QUOTIENT.blinding,
139		},
140	}
141}
142
143func (c *CommonCircuitData) friAllPolys() []FriPolynomialInfo {
144	returnArr := make([]FriPolynomialInfo, 0)
145	returnArr = append(returnArr, c.friPreprocessedPolys()...)
146	returnArr = append(returnArr, c.friWirePolys()...)
147	returnArr = append(returnArr, c.friZSPartialProductsPolys()...)
148	returnArr = append(returnArr, c.friQuotientPolys()...)
149
150	return returnArr
151}
152
153func (c *CommonCircuitData) GetFriInstance(qeAPI *QuadraticExtensionAPI, zeta QuadraticExtension, degreeBits uint64) FriInstanceInfo {
154	zetaBatch := FriBatchInfo{
155		Point:       zeta,
156		Polynomials: c.friAllPolys(),
157	}
158
159	g := field.GoldilocksPrimitiveRootOfUnity(degreeBits)
160	zetaNext := qeAPI.MulExtension(QuadraticExtension{field.NewFieldElement(g.Uint64()), field.ZERO_F}, zeta)
161
162	zetaNextBath := FriBatchInfo{
163		Point:       zetaNext,
164		Polynomials: c.friZSPolys(),
165	}
166
167	return FriInstanceInfo{
168		Oracles: c.friOracles(),
169		Batches: []FriBatchInfo{zetaBatch, zetaNextBath},
170	}
171}