arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/fri/fri_utils.go
fri/fri_utils.goRaw
  1package fri
  2
  3import (
  4	gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks"
  5	"github.com/succinctlabs/gnark-plonky2-verifier/types"
  6)
  7
  8type OpeningBatch struct {
  9	Values []gl.QuadraticExtensionVariable
 10}
 11
 12type Openings struct {
 13	Batches []OpeningBatch
 14}
 15
 16func ToOpenings(c types.OpeningSet) Openings {
 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 := OpeningBatch{Values: values}
 24	zetaNextBatch := OpeningBatch{Values: c.PlonkZsNext}
 25	return Openings{Batches: []OpeningBatch{zetaBatch, zetaNextBatch}}
 26}
 27
 28type PolynomialInfo struct {
 29	OracleIndex    uint64
 30	PolynomialInfo uint64
 31}
 32
 33type OracleInfo struct {
 34	NumPolys uint64
 35	Blinding bool
 36}
 37
 38type BatchInfo struct {
 39	Point       gl.QuadraticExtensionVariable
 40	Polynomials []PolynomialInfo
 41}
 42
 43type InstanceInfo struct {
 44	Oracles []OracleInfo
 45	Batches []BatchInfo
 46}
 47
 48type PlonkOracle struct {
 49	index    uint64
 50	blinding bool
 51}
 52
 53var CONSTANTS_SIGMAS = PlonkOracle{
 54	index:    0,
 55	blinding: false,
 56}
 57
 58var WIRES = PlonkOracle{
 59	index:    1,
 60	blinding: true,
 61}
 62
 63var ZS_PARTIAL_PRODUCTS = PlonkOracle{
 64	index:    2,
 65	blinding: true,
 66}
 67
 68var QUOTIENT = PlonkOracle{
 69	index:    3,
 70	blinding: true,
 71}
 72
 73func polynomialInfoFromRange(c *types.CommonCircuitData, oracleIdx uint64, startPolyIdx uint64, endPolyIdx uint64) []PolynomialInfo {
 74	returnArr := make([]PolynomialInfo, 0)
 75	for i := startPolyIdx; i < endPolyIdx; i++ {
 76		returnArr = append(returnArr,
 77			PolynomialInfo{
 78				OracleIndex:    oracleIdx,
 79				PolynomialInfo: i,
 80			})
 81	}
 82
 83	return returnArr
 84}
 85
 86// Range of the sigma polynomials in the `constants_sigmas_commitment`.
 87func sigmasRange(c *types.CommonCircuitData) []uint64 {
 88	returnArr := make([]uint64, 0)
 89	for i := c.NumConstants; i <= c.NumConstants+c.Config.NumRoutedWires; i++ {
 90		returnArr = append(returnArr, i)
 91	}
 92
 93	return returnArr
 94}
 95
 96func numPreprocessedPolys(c *types.CommonCircuitData) uint64 {
 97	sigmasRange := sigmasRange(c)
 98	return sigmasRange[len(sigmasRange)-1]
 99}
100
101func numZSPartialProductsPolys(c *types.CommonCircuitData) uint64 {
102	return c.Config.NumChallenges * (1 + c.NumPartialProducts)
103}
104
105func numQuotientPolys(c *types.CommonCircuitData) uint64 {
106	return c.Config.NumChallenges * c.QuotientDegreeFactor
107}
108
109func friPreprocessedPolys(c *types.CommonCircuitData) []PolynomialInfo {
110	return polynomialInfoFromRange(
111		c,
112		CONSTANTS_SIGMAS.index,
113		0,
114		numPreprocessedPolys(c),
115	)
116}
117
118func friWirePolys(c *types.CommonCircuitData) []PolynomialInfo {
119	numWirePolys := c.Config.NumWires
120	return polynomialInfoFromRange(c, WIRES.index, 0, numWirePolys)
121}
122
123func friZSPartialProductsPolys(c *types.CommonCircuitData) []PolynomialInfo {
124	return polynomialInfoFromRange(
125		c,
126		ZS_PARTIAL_PRODUCTS.index,
127		0,
128		numZSPartialProductsPolys(c),
129	)
130}
131
132func friQuotientPolys(c *types.CommonCircuitData) []PolynomialInfo {
133	return polynomialInfoFromRange(
134		c,
135		QUOTIENT.index,
136		0,
137		numQuotientPolys(c),
138	)
139}
140
141func friZSPolys(c *types.CommonCircuitData) []PolynomialInfo {
142	return polynomialInfoFromRange(
143		c,
144		ZS_PARTIAL_PRODUCTS.index,
145		0,
146		c.Config.NumChallenges,
147	)
148}
149
150func friOracles(c *types.CommonCircuitData) []OracleInfo {
151	return []OracleInfo{
152		{
153			NumPolys: numPreprocessedPolys(c),
154			Blinding: CONSTANTS_SIGMAS.blinding,
155		},
156		{
157			NumPolys: c.Config.NumWires,
158			Blinding: WIRES.blinding,
159		},
160		{
161			NumPolys: numZSPartialProductsPolys(c),
162			Blinding: ZS_PARTIAL_PRODUCTS.blinding,
163		},
164		{
165			NumPolys: numQuotientPolys(c),
166			Blinding: QUOTIENT.blinding,
167		},
168	}
169}
170
171func friAllPolys(c *types.CommonCircuitData) []PolynomialInfo {
172	returnArr := make([]PolynomialInfo, 0)
173	returnArr = append(returnArr, friPreprocessedPolys(c)...)
174	returnArr = append(returnArr, friWirePolys(c)...)
175	returnArr = append(returnArr, friZSPartialProductsPolys(c)...)
176	returnArr = append(returnArr, friQuotientPolys(c)...)
177
178	return returnArr
179}
180
181func GetInstance(c *types.CommonCircuitData, glApi *gl.Chip, zeta gl.QuadraticExtensionVariable, degreeBits uint64) InstanceInfo {
182	zetaBatch := BatchInfo{
183		Point:       zeta,
184		Polynomials: friAllPolys(c),
185	}
186
187	g := gl.PrimitiveRootOfUnity(degreeBits)
188	zetaNext := glApi.MulExtension(
189		gl.NewVariable(g.Uint64()).ToQuadraticExtension(),
190		zeta,
191	)
192
193	zetaNextBath := BatchInfo{
194		Point:       zetaNext,
195		Polynomials: friZSPolys(c),
196	}
197
198	return InstanceInfo{
199		Oracles: friOracles(c),
200		Batches: []BatchInfo{zetaBatch, zetaNextBath},
201	}
202}