gnark-plonky2-verifier/plonky2_verifier/deserialize.go
plonky2_verifier/deserialize.goRaw
1package plonky2_verifier
2
3import (
4 "encoding/json"
5 . "gnark-ed25519/field"
6 "gnark-ed25519/utils"
7 "io/ioutil"
8 "os"
9)
10
11type ProofWithPublicInputsRaw struct {
12 Proof struct {
13 WiresCap []struct {
14 Elements []uint64 `json:"elements"`
15 } `json:"wires_cap"`
16 PlonkZsPartialProductsCap []struct {
17 Elements []uint64 `json:"elements"`
18 } `json:"plonk_zs_partial_products_cap"`
19 QuotientPolysCap []struct {
20 Elements []uint64 `json:"elements"`
21 } `json:"quotient_polys_cap"`
22 Openings struct {
23 Constants [][]uint64 `json:"constants"`
24 PlonkSigmas [][]uint64 `json:"plonk_sigmas"`
25 Wires [][]uint64 `json:"wires"`
26 PlonkZs [][]uint64 `json:"plonk_zs"`
27 PlonkZsNext [][]uint64 `json:"plonk_zs_next"`
28 PartialProducts [][]uint64 `json:"partial_products"`
29 QuotientPolys [][]uint64 `json:"quotient_polys"`
30 } `json:"openings"`
31 OpeningProof struct {
32 CommitPhaseMerkleCaps []interface{} `json:"commit_phase_merkle_caps"`
33 QueryRoundProofs []struct {
34 InitialTreesProof struct {
35 EvalsProofs []EvalProofRaw `json:"evals_proofs"`
36 } `json:"initial_trees_proof"`
37 Steps []struct {
38 Evals [][]uint64 `json:"evals"`
39 MerkleProof MerkleProofRaw `json:"merkle_proof"`
40 } `json:"steps"`
41 } `json:"query_round_proofs"`
42 FinalPoly struct {
43 Coeffs [][]uint64 `json:"coeffs"`
44 } `json:"final_poly"`
45 PowWitness uint64 `json:"pow_witness"`
46 } `json:"opening_proof"`
47 } `json:"proof"`
48 PublicInputs []uint64 `json:"public_inputs"`
49}
50
51type EvalProofRaw struct {
52 leafElements []uint64
53 merkleProof MerkleProofRaw
54}
55
56func (e *EvalProofRaw) UnmarshalJSON(data []byte) error {
57 return json.Unmarshal(data, &[]interface{}{&e.leafElements, &e.merkleProof})
58}
59
60type MerkleProofRaw struct {
61 hash [][]uint64
62}
63
64func (m *MerkleProofRaw) UnmarshalJSON(data []byte) error {
65 type SiblingObject struct {
66 Siblings []map[string][]uint64 // "siblings"
67 }
68
69 var siblings SiblingObject
70 if err := json.Unmarshal(data, &siblings); err != nil {
71 panic(err)
72 }
73
74 m.hash = make([][]uint64, len(siblings.Siblings))
75 for siblingIdx, sibling := range siblings.Siblings {
76 m.hash[siblingIdx] = sibling["elements"]
77 }
78
79 return nil
80}
81
82type CommonCircuitDataRaw struct {
83 Config struct {
84 NumWires uint64 `json:"num_wires"`
85 NumRoutedWires uint64 `json:"num_routed_wires"`
86 NumConstants uint64 `json:"num_constants"`
87 UseBaseArithmeticGate bool `json:"use_base_arithmetic_gate"`
88 SecurityBits uint64 `json:"security_bits"`
89 NumChallenges uint64 `json:"num_challenges"`
90 ZeroKnowledge bool `json:"zero_knowledge"`
91 MaxQuotientDegreeFactor uint64 `json:"max_quotient_degree_factor"`
92 FriConfig struct {
93 RateBits uint64 `json:"rate_bits"`
94 CapHeight uint64 `json:"cap_height"`
95 ProofOfWorkBits uint64 `json:"proof_of_work_bits"`
96 ReductionStrategy struct {
97 ConstantArityBits []uint64 `json:"ConstantArityBits"`
98 } `json:"reduction_strategy"`
99 NumQueryRounds uint64 `json:"num_query_rounds"`
100 } `json:"fri_config"`
101 } `json:"config"`
102 FriParams struct {
103 Config struct {
104 RateBits uint64 `json:"rate_bits"`
105 CapHeight uint64 `json:"cap_height"`
106 ProofOfWorkBits uint64 `json:"proof_of_work_bits"`
107 ReductionStrategy struct {
108 ConstantArityBits []uint64 `json:"ConstantArityBits"`
109 } `json:"reduction_strategy"`
110 NumQueryRounds uint64 `json:"num_query_rounds"`
111 } `json:"config"`
112 Hiding bool `json:"hiding"`
113 DegreeBits uint64 `json:"degree_bits"`
114 ReductionArityBits []uint64 `json:"reduction_arity_bits"`
115 } `json:"fri_params"`
116 DegreeBits uint64 `json:"degree_bits"`
117 SelectorsInfo struct {
118 SelectorIndices []uint64 `json:"selector_indices"`
119 Groups []struct {
120 Start uint64 `json:"start"`
121 End uint64 `json:"end"`
122 } `json:"groups"`
123 } `json:"selectors_info"`
124 QuotientDegreeFactor uint64 `json:"quotient_degree_factor"`
125 NumGateConstraints uint64 `json:"num_gate_constraints"`
126 NumConstants uint64 `json:"num_constants"`
127 NumPublicInputs uint64 `json:"num_public_inputs"`
128 KIs []uint64 `json:"k_is"`
129 NumPartialProducts uint64 `json:"num_partial_products"`
130 CircuitDigest struct {
131 Elements []uint64 `json:"elements"`
132 } `json:"circuit_digest"`
133}
134
135type VerifierOnlyCircuitDataRaw struct {
136 ConstantsSigmasCap []struct {
137 Elements []uint64 `json:"elements"`
138 } `json:"constants_sigmas_cap"`
139}
140
141func DeserializeMerkleCap(merkleCapRaw []struct{ Elements []uint64 }) MerkleCap {
142 n := len(merkleCapRaw)
143 merkleCap := make([]Hash, n)
144 for i := 0; i < n; i++ {
145 copy(merkleCap[i][:], utils.Uint64ArrayToFArray(merkleCapRaw[i].Elements))
146 }
147 return merkleCap
148}
149
150func DeserializeMerkleProof(merkleProofRaw struct{ Siblings []interface{} }) MerkleProof {
151 n := len(merkleProofRaw.Siblings)
152 var mp MerkleProof
153 mp.Siblings = make([]Hash, n)
154 for i := 0; i < n; i++ {
155 element := merkleProofRaw.Siblings[i].(struct{ Elements []uint64 })
156 copy(mp.Siblings[i][:], utils.Uint64ArrayToFArray(element.Elements))
157 }
158 return mp
159}
160
161func DeserializeOpeningSet(openingSetRaw struct {
162 Constants [][]uint64
163 PlonkSigmas [][]uint64
164 Wires [][]uint64
165 PlonkZs [][]uint64
166 PlonkZsNext [][]uint64
167 PartialProducts [][]uint64
168 QuotientPolys [][]uint64
169}) OpeningSet {
170 return OpeningSet{
171 Constants: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Constants),
172 PlonkSigmas: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkSigmas),
173 Wires: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Wires),
174 PlonkZs: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZs),
175 PlonkZsNext: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZsNext),
176 PartialProducts: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PartialProducts),
177 QuotientPolys: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.QuotientPolys),
178 }
179}
180
181func DeserializeFriProof(openingProofRaw struct {
182 CommitPhaseMerkleCaps []interface{}
183 QueryRoundProofs []struct {
184 InitialTreesProof struct {
185 EvalsProofs []EvalProofRaw
186 }
187 Steps []struct {
188 Evals [][]uint64
189 MerkleProof MerkleProofRaw
190 }
191 }
192 FinalPoly struct {
193 Coeffs [][]uint64
194 }
195 PowWitness uint64
196}) FriProof {
197 var openingProof FriProof
198 openingProof.PowWitness = NewFieldElement(openingProofRaw.PowWitness)
199 openingProof.FinalPoly.Coeffs = utils.Uint64ArrayToQuadraticExtensionArray(openingProofRaw.FinalPoly.Coeffs)
200
201 numQueryRoundProofs := len(openingProofRaw.QueryRoundProofs)
202 openingProof.QueryRoundProofs = make([]FriQueryRound, numQueryRoundProofs)
203
204 for i := 0; i < numQueryRoundProofs; i++ {
205 numEvalProofs := len(openingProofRaw.QueryRoundProofs[i].InitialTreesProof.EvalsProofs)
206 openingProof.QueryRoundProofs[i].InitialTreesProof.EvalsProofs = make([]EvalProof, numEvalProofs)
207 for j := 0; j < numEvalProofs; j++ {
208 openingProof.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].Elements = utils.Uint64ArrayToFArray(openingProofRaw.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].leafElements)
209 openingProof.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].MerkleProof.Siblings = utils.Uint64ArrayToHashArray(openingProofRaw.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].merkleProof.hash)
210 }
211
212 numSteps := len(openingProofRaw.QueryRoundProofs[i].Steps)
213 openingProof.QueryRoundProofs[i].Steps = make([]FriQueryStep, numSteps)
214 for j := 0; j < numSteps; j++ {
215 openingProof.QueryRoundProofs[i].Steps[j].Evals = utils.Uint64ArrayToQuadraticExtensionArray(openingProofRaw.QueryRoundProofs[i].Steps[j].Evals)
216 openingProof.QueryRoundProofs[i].Steps[j].MerkleProof.Siblings = utils.Uint64ArrayToHashArray(openingProofRaw.QueryRoundProofs[i].Steps[j].MerkleProof.hash)
217 }
218 }
219
220 return openingProof
221}
222
223func DeserializeProofWithPublicInputs(path string) ProofWithPublicInputs {
224 jsonFile, err := os.Open(path)
225 if err != nil {
226 panic(err)
227 }
228
229 defer jsonFile.Close()
230 rawBytes, _ := ioutil.ReadAll(jsonFile)
231
232 var raw ProofWithPublicInputsRaw
233 err = json.Unmarshal(rawBytes, &raw)
234 if err != nil {
235 panic(err)
236 }
237
238 var proofWithPis ProofWithPublicInputs
239 proofWithPis.Proof.WiresCap = DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.Proof.WiresCap))
240 proofWithPis.Proof.PlonkZsPartialProductsCap = DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.Proof.PlonkZsPartialProductsCap))
241 proofWithPis.Proof.QuotientPolysCap = DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.Proof.QuotientPolysCap))
242 proofWithPis.Proof.Openings = DeserializeOpeningSet(struct {
243 Constants [][]uint64
244 PlonkSigmas [][]uint64
245 Wires [][]uint64
246 PlonkZs [][]uint64
247 PlonkZsNext [][]uint64
248 PartialProducts [][]uint64
249 QuotientPolys [][]uint64
250 }(raw.Proof.Openings))
251 proofWithPis.Proof.OpeningProof = DeserializeFriProof(struct {
252 CommitPhaseMerkleCaps []interface{}
253 QueryRoundProofs []struct {
254 InitialTreesProof struct {
255 EvalsProofs []EvalProofRaw
256 }
257 Steps []struct {
258 Evals [][]uint64
259 MerkleProof MerkleProofRaw
260 }
261 }
262 FinalPoly struct{ Coeffs [][]uint64 }
263 PowWitness uint64
264 }(raw.Proof.OpeningProof))
265 proofWithPis.PublicInputs = utils.Uint64ArrayToFArray(raw.PublicInputs)
266
267 return proofWithPis
268}
269
270func ReductionArityBits(
271 arityBits uint64,
272 finalPolyBits uint64,
273 degreeBits uint64,
274 rateBits uint64,
275 capHeight uint64,
276) []uint64 {
277 returnArr := make([]uint64, 0)
278
279 for degreeBits > finalPolyBits && degreeBits+rateBits-arityBits >= capHeight {
280 returnArr = append(returnArr, arityBits)
281 if degreeBits < arityBits {
282 panic("degreeBits < arityBits")
283 }
284 degreeBits -= arityBits
285 }
286
287 return returnArr
288}
289
290func DeserializeCommonCircuitData(path string) CommonCircuitData {
291 jsonFile, err := os.Open(path)
292 if err != nil {
293 panic(err)
294 }
295
296 defer jsonFile.Close()
297 rawBytes, _ := ioutil.ReadAll(jsonFile)
298
299 var raw CommonCircuitDataRaw
300 err = json.Unmarshal(rawBytes, &raw)
301 if err != nil {
302 panic(err)
303 }
304
305 var commonCircuitData CommonCircuitData
306 commonCircuitData.Config.NumWires = raw.Config.NumWires
307 commonCircuitData.Config.NumRoutedWires = raw.Config.NumRoutedWires
308 commonCircuitData.Config.NumConstants = raw.Config.NumConstants
309 commonCircuitData.Config.UseBaseArithmeticGate = raw.Config.UseBaseArithmeticGate
310 commonCircuitData.Config.SecurityBits = raw.Config.SecurityBits
311 commonCircuitData.Config.NumChallenges = raw.Config.NumChallenges
312 commonCircuitData.Config.ZeroKnowledge = raw.Config.ZeroKnowledge
313 commonCircuitData.Config.MaxQuotientDegreeFactor = raw.Config.MaxQuotientDegreeFactor
314
315 commonCircuitData.Config.FriConfig.RateBits = raw.Config.FriConfig.RateBits
316 commonCircuitData.Config.FriConfig.CapHeight = raw.Config.FriConfig.CapHeight
317 commonCircuitData.Config.FriConfig.ProofOfWorkBits = raw.Config.FriConfig.ProofOfWorkBits
318 commonCircuitData.Config.FriConfig.NumQueryRounds = raw.Config.FriConfig.NumQueryRounds
319
320 commonCircuitData.FriParams.DegreeBits = raw.FriParams.DegreeBits
321 commonCircuitData.FriParams.Config.RateBits = raw.FriParams.Config.RateBits
322 commonCircuitData.FriParams.Config.CapHeight = raw.FriParams.Config.CapHeight
323 commonCircuitData.FriParams.Config.ProofOfWorkBits = raw.FriParams.Config.ProofOfWorkBits
324 commonCircuitData.FriParams.Config.NumQueryRounds = raw.FriParams.Config.NumQueryRounds
325 commonCircuitData.FriParams.ReductionArityBits = raw.FriParams.ReductionArityBits
326
327 commonCircuitData.DegreeBits = raw.DegreeBits
328 commonCircuitData.QuotientDegreeFactor = raw.QuotientDegreeFactor
329 commonCircuitData.NumGateConstraints = raw.NumGateConstraints
330 commonCircuitData.NumConstants = raw.NumConstants
331 commonCircuitData.NumPublicInputs = raw.NumPublicInputs
332 commonCircuitData.KIs = utils.Uint64ArrayToFArray(raw.KIs)
333 commonCircuitData.NumPartialProducts = raw.NumPartialProducts
334 copy(commonCircuitData.CircuitDigest[:], utils.Uint64ArrayToFArray(raw.CircuitDigest.Elements))
335
336 return commonCircuitData
337}
338
339func DeserializeVerifierOnlyCircuitData(path string) VerifierOnlyCircuitData {
340 jsonFile, err := os.Open(path)
341 if err != nil {
342 panic(err)
343 }
344
345 defer jsonFile.Close()
346 rawBytes, _ := ioutil.ReadAll(jsonFile)
347
348 var raw VerifierOnlyCircuitDataRaw
349 err = json.Unmarshal(rawBytes, &raw)
350 if err != nil {
351 panic(err)
352 }
353
354 return VerifierOnlyCircuitData{
355 ConstantSigmasCap: DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.ConstantsSigmasCap)),
356 }
357}