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 // 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 := 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// Range of the sigma polynomials in the `constants_sigmas_commitment`.
62func (c *CommonCircuitData) sigmasRange() []uint64 {
63 returnArr := make([]uint64, 0)
64 for i := c.NumConstants; i <= c.NumConstants+c.Config.NumRoutedWires; i++ {
65 returnArr = append(returnArr, i)
66 }
67
68 return returnArr
69}
70
71func (c *CommonCircuitData) numPreprocessedPolys() uint64 {
72 sigmasRange := c.sigmasRange()
73 return sigmasRange[len(sigmasRange)-1]
74}
75
76func (c *CommonCircuitData) numZSPartialProductsPolys() uint64 {
77 return c.Config.NumChallenges * (1 + c.NumPartialProducts)
78}
79
80func (c *CommonCircuitData) numQuotientPolys() uint64 {
81 return c.Config.NumChallenges * c.QuotientDegreeFactor
82}
83
84func (c *CommonCircuitData) friPreprocessedPolys() []FriPolynomialInfo {
85 return c.polynomialInfoFromRange(
86 CONSTANTS_SIGMAS.index,
87 0,
88 c.numPreprocessedPolys(),
89 )
90}
91
92func (c *CommonCircuitData) friWirePolys() []FriPolynomialInfo {
93 numWirePolys := c.Config.NumWires
94 return c.polynomialInfoFromRange(WIRES.index, 0, numWirePolys)
95}
96
97func (c *CommonCircuitData) friZSPartialProductsPolys() []FriPolynomialInfo {
98 return c.polynomialInfoFromRange(
99 ZS_PARTIAL_PRODUCTS.index,
100 0,
101 c.numZSPartialProductsPolys(),
102 )
103}
104
105func (c *CommonCircuitData) friQuotientPolys() []FriPolynomialInfo {
106 return c.polynomialInfoFromRange(
107 QUOTIENT.index,
108 0,
109 c.numQuotientPolys(),
110 )
111}
112
113func (c *CommonCircuitData) friZSPolys() []FriPolynomialInfo {
114 return c.polynomialInfoFromRange(
115 ZS_PARTIAL_PRODUCTS.index,
116 0,
117 c.Config.NumChallenges,
118 )
119}
120
121func (c *CommonCircuitData) friOracles() []FriOracleInfo {
122 return []FriOracleInfo{
123 {
124 NumPolys: c.numPreprocessedPolys(),
125 Blinding: CONSTANTS_SIGMAS.blinding,
126 },
127 {
128 NumPolys: c.Config.NumWires,
129 Blinding: WIRES.blinding,
130 },
131 {
132 NumPolys: c.numZSPartialProductsPolys(),
133 Blinding: ZS_PARTIAL_PRODUCTS.blinding,
134 },
135 {
136 NumPolys: c.numQuotientPolys(),
137 Blinding: QUOTIENT.blinding,
138 },
139 }
140}
141
142func (c *CommonCircuitData) friAllPolys() []FriPolynomialInfo {
143 returnArr := make([]FriPolynomialInfo, 0)
144 returnArr = append(returnArr, c.friPreprocessedPolys()...)
145 returnArr = append(returnArr, c.friWirePolys()...)
146 returnArr = append(returnArr, c.friZSPartialProductsPolys()...)
147 returnArr = append(returnArr, c.friQuotientPolys()...)
148
149 return returnArr
150}
151
152func (c *CommonCircuitData) GetFriInstance(qeAPI *QuadraticExtensionAPI, zeta QuadraticExtension, degreeBits uint64) FriInstanceInfo {
153 zetaBatch := FriBatchInfo{
154 Point: zeta,
155 Polynomials: c.friAllPolys(),
156 }
157
158 g := field.GoldilocksPrimitiveRootOfUnity(degreeBits)
159 zetaNext := qeAPI.MulExtension(qeAPI.FieldToQE(field.NewFieldElement(g.Uint64())), zeta)
160
161 zetaNextBath := FriBatchInfo{
162 Point: zetaNext,
163 Polynomials: c.friZSPolys(),
164 }
165
166 return FriInstanceInfo{
167 Oracles: c.friOracles(),
168 Batches: []FriBatchInfo{zetaBatch, zetaNextBath},
169 }
170}