package fri import ( "github.com/succinctlabs/gnark-plonky2-verifier/types" ) type PolynomialInfo struct { OracleIndex uint64 PolynomialInfo uint64 } type OracleInfo struct { NumPolys uint64 Blinding bool } type PlonkOracle struct { index uint64 blinding bool } var CONSTANTS_SIGMAS = PlonkOracle{ index: 0, blinding: false, } var WIRES = PlonkOracle{ index: 1, blinding: true, } var ZS_PARTIAL_PRODUCTS = PlonkOracle{ index: 2, blinding: true, } var QUOTIENT = PlonkOracle{ index: 3, blinding: true, } func polynomialInfoFromRange(c *types.CommonCircuitData, oracleIdx uint64, startPolyIdx uint64, endPolyIdx uint64) []PolynomialInfo { returnArr := make([]PolynomialInfo, 0) for i := startPolyIdx; i < endPolyIdx; i++ { returnArr = append(returnArr, PolynomialInfo{ OracleIndex: oracleIdx, PolynomialInfo: i, }) } return returnArr } // Range of the sigma polynomials in the `constants_sigmas_commitment`. func sigmasRange(c *types.CommonCircuitData) []uint64 { returnArr := make([]uint64, 0) for i := c.NumConstants; i <= c.NumConstants+c.Config.NumRoutedWires; i++ { returnArr = append(returnArr, i) } return returnArr } func numPreprocessedPolys(c *types.CommonCircuitData) uint64 { sigmasRange := sigmasRange(c) return sigmasRange[len(sigmasRange)-1] } func numZSPartialProductsPolys(c *types.CommonCircuitData) uint64 { return c.Config.NumChallenges * (1 + c.NumPartialProducts) } func numQuotientPolys(c *types.CommonCircuitData) uint64 { return c.Config.NumChallenges * c.QuotientDegreeFactor } func friPreprocessedPolys(c *types.CommonCircuitData) []PolynomialInfo { return polynomialInfoFromRange( c, CONSTANTS_SIGMAS.index, 0, numPreprocessedPolys(c), ) } func friWirePolys(c *types.CommonCircuitData) []PolynomialInfo { numWirePolys := c.Config.NumWires return polynomialInfoFromRange(c, WIRES.index, 0, numWirePolys) } func friZSPartialProductsPolys(c *types.CommonCircuitData) []PolynomialInfo { return polynomialInfoFromRange( c, ZS_PARTIAL_PRODUCTS.index, 0, numZSPartialProductsPolys(c), ) } func friQuotientPolys(c *types.CommonCircuitData) []PolynomialInfo { return polynomialInfoFromRange( c, QUOTIENT.index, 0, numQuotientPolys(c), ) } func friZSPolys(c *types.CommonCircuitData) []PolynomialInfo { return polynomialInfoFromRange( c, ZS_PARTIAL_PRODUCTS.index, 0, c.Config.NumChallenges, ) } func friOracles(c *types.CommonCircuitData) []OracleInfo { return []OracleInfo{ { NumPolys: numPreprocessedPolys(c), Blinding: CONSTANTS_SIGMAS.blinding, }, { NumPolys: c.Config.NumWires, Blinding: WIRES.blinding, }, { NumPolys: numZSPartialProductsPolys(c), Blinding: ZS_PARTIAL_PRODUCTS.blinding, }, { NumPolys: numQuotientPolys(c), Blinding: QUOTIENT.blinding, }, } } func friAllPolys(c *types.CommonCircuitData) []PolynomialInfo { returnArr := make([]PolynomialInfo, 0) returnArr = append(returnArr, friPreprocessedPolys(c)...) returnArr = append(returnArr, friWirePolys(c)...) returnArr = append(returnArr, friZSPartialProductsPolys(c)...) returnArr = append(returnArr, friQuotientPolys(c)...) return returnArr }