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