arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/fri/fri_utils.go
fri/fri_utils.goRaw
  1package fri
  2
  3import (
  4	"github.com/succinctlabs/gnark-plonky2-verifier/types"
  5)
  6
  7type PolynomialInfo struct {
  8	OracleIndex    uint64
  9	PolynomialInfo uint64
 10}
 11
 12type OracleInfo struct {
 13	NumPolys uint64
 14	Blinding bool
 15}
 16
 17type PlonkOracle struct {
 18	index    uint64
 19	blinding bool
 20}
 21
 22var CONSTANTS_SIGMAS = PlonkOracle{
 23	index:    0,
 24	blinding: false,
 25}
 26
 27var WIRES = PlonkOracle{
 28	index:    1,
 29	blinding: true,
 30}
 31
 32var ZS_PARTIAL_PRODUCTS = PlonkOracle{
 33	index:    2,
 34	blinding: true,
 35}
 36
 37var QUOTIENT = PlonkOracle{
 38	index:    3,
 39	blinding: true,
 40}
 41
 42func polynomialInfoFromRange(c *types.CommonCircuitData, oracleIdx uint64, startPolyIdx uint64, endPolyIdx uint64) []PolynomialInfo {
 43	returnArr := make([]PolynomialInfo, 0)
 44	for i := startPolyIdx; i < endPolyIdx; i++ {
 45		returnArr = append(returnArr,
 46			PolynomialInfo{
 47				OracleIndex:    oracleIdx,
 48				PolynomialInfo: i,
 49			})
 50	}
 51
 52	return returnArr
 53}
 54
 55// Range of the sigma polynomials in the `constants_sigmas_commitment`.
 56func sigmasRange(c *types.CommonCircuitData) []uint64 {
 57	returnArr := make([]uint64, 0)
 58	for i := c.NumConstants; i <= c.NumConstants+c.Config.NumRoutedWires; i++ {
 59		returnArr = append(returnArr, i)
 60	}
 61
 62	return returnArr
 63}
 64
 65func numPreprocessedPolys(c *types.CommonCircuitData) uint64 {
 66	sigmasRange := sigmasRange(c)
 67	return sigmasRange[len(sigmasRange)-1]
 68}
 69
 70func numZSPartialProductsPolys(c *types.CommonCircuitData) uint64 {
 71	return c.Config.NumChallenges * (1 + c.NumPartialProducts)
 72}
 73
 74func numQuotientPolys(c *types.CommonCircuitData) uint64 {
 75	return c.Config.NumChallenges * c.QuotientDegreeFactor
 76}
 77
 78func friPreprocessedPolys(c *types.CommonCircuitData) []PolynomialInfo {
 79	return polynomialInfoFromRange(
 80		c,
 81		CONSTANTS_SIGMAS.index,
 82		0,
 83		numPreprocessedPolys(c),
 84	)
 85}
 86
 87func friWirePolys(c *types.CommonCircuitData) []PolynomialInfo {
 88	numWirePolys := c.Config.NumWires
 89	return polynomialInfoFromRange(c, WIRES.index, 0, numWirePolys)
 90}
 91
 92func friZSPartialProductsPolys(c *types.CommonCircuitData) []PolynomialInfo {
 93	return polynomialInfoFromRange(
 94		c,
 95		ZS_PARTIAL_PRODUCTS.index,
 96		0,
 97		numZSPartialProductsPolys(c),
 98	)
 99}
100
101func friQuotientPolys(c *types.CommonCircuitData) []PolynomialInfo {
102	return polynomialInfoFromRange(
103		c,
104		QUOTIENT.index,
105		0,
106		numQuotientPolys(c),
107	)
108}
109
110func friZSPolys(c *types.CommonCircuitData) []PolynomialInfo {
111	return polynomialInfoFromRange(
112		c,
113		ZS_PARTIAL_PRODUCTS.index,
114		0,
115		c.Config.NumChallenges,
116	)
117}
118
119func friOracles(c *types.CommonCircuitData) []OracleInfo {
120	return []OracleInfo{
121		{
122			NumPolys: numPreprocessedPolys(c),
123			Blinding: CONSTANTS_SIGMAS.blinding,
124		},
125		{
126			NumPolys: c.Config.NumWires,
127			Blinding: WIRES.blinding,
128		},
129		{
130			NumPolys: numZSPartialProductsPolys(c),
131			Blinding: ZS_PARTIAL_PRODUCTS.blinding,
132		},
133		{
134			NumPolys: numQuotientPolys(c),
135			Blinding: QUOTIENT.blinding,
136		},
137	}
138}
139
140func friAllPolys(c *types.CommonCircuitData) []PolynomialInfo {
141	returnArr := make([]PolynomialInfo, 0)
142	returnArr = append(returnArr, friPreprocessedPolys(c)...)
143	returnArr = append(returnArr, friWirePolys(c)...)
144	returnArr = append(returnArr, friZSPartialProductsPolys(c)...)
145	returnArr = append(returnArr, friQuotientPolys(c)...)
146
147	return returnArr
148}