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}