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 [][]interface{} `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 []interface{} `json:"public_inputs"`
46}
47
48type CommonCircuitDataRaw struct {
49 Config struct {
50 NumWires uint64 `json:"num_wires"`
51 NumRoutedWires uint64 `json:"num_routed_wires"`
52 NumConstants uint64 `json:"num_constants"`
53 UseBaseArithmeticGate bool `json:"use_base_arithmetic_gate"`
54 SecurityBits uint64 `json:"security_bits"`
55 NumChallenges uint64 `json:"num_challenges"`
56 ZeroKnowledge bool `json:"zero_knowledge"`
57 MaxQuotientDegreeFactor uint64 `json:"max_quotient_degree_factor"`
58 FriConfig struct {
59 RateBits uint64 `json:"rate_bits"`
60 CapHeight uint64 `json:"cap_height"`
61 ProofOfWorkBits uint64 `json:"proof_of_work_bits"`
62 ReductionStrategy struct {
63 ConstantArityBits []int `json:"ConstantArityBits"`
64 } `json:"reduction_strategy"`
65 NumQueryRounds uint64 `json:"num_query_rounds"`
66 } `json:"fri_config"`
67 } `json:"config"`
68 FriParams struct {
69 Config struct {
70 RateBits uint64 `json:"rate_bits"`
71 CapHeight uint64 `json:"cap_height"`
72 ProofOfWorkBits uint64 `json:"proof_of_work_bits"`
73 ReductionStrategy struct {
74 ConstantArityBits []uint64 `json:"ConstantArityBits"`
75 } `json:"reduction_strategy"`
76 NumQueryRounds uint64 `json:"num_query_rounds"`
77 } `json:"config"`
78 Hiding bool `json:"hiding"`
79 DegreeBits uint64 `json:"degree_bits"`
80 ReductionArityBits []interface{} `json:"reduction_arity_bits"`
81 } `json:"fri_params"`
82 DegreeBits uint64 `json:"degree_bits"`
83 SelectorsInfo struct {
84 SelectorIndices []uint64 `json:"selector_indices"`
85 Groups []struct {
86 Start uint64 `json:"start"`
87 End uint64 `json:"end"`
88 } `json:"groups"`
89 } `json:"selectors_info"`
90 QuotientDegreeFactor uint64 `json:"quotient_degree_factor"`
91 NumGateConstraints uint64 `json:"num_gate_constraints"`
92 NumConstants uint64 `json:"num_constants"`
93 NumPublicInputs uint64 `json:"num_public_inputs"`
94 KIs []uint64 `json:"k_is"`
95 NumPartialProducts uint64 `json:"num_partial_products"`
96 CircuitDigest struct {
97 Elements []uint64 `json:"elements"`
98 } `json:"circuit_digest"`
99}
100
101type VerifierOnlyCircuitDataRaw struct {
102 ConstantsSigmasCap []struct {
103 Elements []uint64 `json:"elements"`
104 } `json:"constants_sigmas_cap"`
105}
106
107func DeserializeMerkleCap(merkleCapRaw []struct{ Elements []uint64 }) MerkleCap {
108 n := len(merkleCapRaw)
109 merkleCap := make([]Hash, n)
110 for i := 0; i < n; i++ {
111 copy(merkleCap[i][:], utils.Uint64ArrayToFArray(merkleCapRaw[i].Elements))
112 }
113 return merkleCap
114}
115
116func DeserializeOpeningSet(openingSetRaw struct {
117 Constants [][]uint64
118 PlonkSigmas [][]uint64
119 Wires [][]uint64
120 PlonkZs [][]uint64
121 PlonkZsNext [][]uint64
122 PartialProducts [][]uint64
123 QuotientPolys [][]uint64
124}) OpeningSet {
125 return OpeningSet{
126 Constants: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Constants),
127 PlonkSigmas: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkSigmas),
128 Wires: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Wires),
129 PlonkZs: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZs),
130 PlonkZsNext: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZsNext),
131 PartialProducts: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PartialProducts),
132 QuotientPolys: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.QuotientPolys),
133 }
134}
135
136func DeserializeFriProof(openingProofRaw struct {
137 CommitPhaseMerkleCaps []interface{}
138 QueryRoundProofs []struct {
139 InitialTreesProof struct {
140 EvalsProofs [][]interface{}
141 }
142 Steps []interface{}
143 }
144 FinalPoly struct {
145 Coeffs [][]uint64
146 }
147 PowWitness uint64
148}) FriProof {
149 var openingProof FriProof
150 openingProof.PowWitness = NewFieldElement(openingProofRaw.PowWitness)
151 openingProof.FinalPoly.Coeffs = utils.Uint64ArrayToQuadraticExtensionArray(openingProofRaw.FinalPoly.Coeffs)
152 return openingProof
153}
154
155func DeserializeProofWithPublicInputs(path string) ProofWithPublicInputs {
156 jsonFile, err := os.Open(path)
157 if err != nil {
158 panic(err)
159 }
160
161 defer jsonFile.Close()
162 rawBytes, _ := ioutil.ReadAll(jsonFile)
163
164 var raw ProofWithPublicInputsRaw
165 err = json.Unmarshal(rawBytes, &raw)
166 if err != nil {
167 panic(err)
168 }
169
170 var proofWithPis ProofWithPublicInputs
171 proofWithPis.Proof.WiresCap = DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.Proof.WiresCap))
172 proofWithPis.Proof.PlonkZsPartialProductsCap = DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.Proof.PlonkZsPartialProductsCap))
173 proofWithPis.Proof.QuotientPolysCap = DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.Proof.QuotientPolysCap))
174 proofWithPis.Proof.Openings = DeserializeOpeningSet(struct {
175 Constants [][]uint64
176 PlonkSigmas [][]uint64
177 Wires [][]uint64
178 PlonkZs [][]uint64
179 PlonkZsNext [][]uint64
180 PartialProducts [][]uint64
181 QuotientPolys [][]uint64
182 }(raw.Proof.Openings))
183 proofWithPis.Proof.OpeningProof = DeserializeFriProof(struct {
184 CommitPhaseMerkleCaps []interface{}
185 QueryRoundProofs []struct {
186 InitialTreesProof struct{ EvalsProofs [][]interface{} }
187 Steps []interface{}
188 }
189 FinalPoly struct{ Coeffs [][]uint64 }
190 PowWitness uint64
191 }(raw.Proof.OpeningProof))
192
193 return proofWithPis
194}
195
196func DeserializeCommonCircuitData(path string) CommonCircuitDataRaw {
197 jsonFile, err := os.Open(path)
198 if err != nil {
199 panic(err)
200 }
201
202 defer jsonFile.Close()
203 rawBytes, _ := ioutil.ReadAll(jsonFile)
204
205 var raw CommonCircuitDataRaw
206 err = json.Unmarshal(rawBytes, &raw)
207 if err != nil {
208 panic(err)
209 }
210
211 return raw
212}
213
214func DeserializeVerifierOnlyCircuitData(path string) VerifierOnlyCircuitData {
215 jsonFile, err := os.Open(path)
216 if err != nil {
217 panic(err)
218 }
219
220 defer jsonFile.Close()
221 rawBytes, _ := ioutil.ReadAll(jsonFile)
222
223 var raw VerifierOnlyCircuitDataRaw
224 err = json.Unmarshal(rawBytes, &raw)
225 if err != nil {
226 panic(err)
227 }
228
229 return VerifierOnlyCircuitData{
230 ConstantSigmasCap: DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.ConstantsSigmasCap)),
231 }
232}