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}