gnark-plonky2-verifier/plonky2_verifier/deserialize_proof.go
plonky2_verifier/deserialize_proof.goRaw
1package plonky2_verifier
2
3import (
4 "encoding/json"
5 . "gnark-ed25519/field"
6 "gnark-ed25519/utils"
7 "io/ioutil"
8 "os"
9)
10
11// type HashRaw = []uint64
12
13// type MerkleCapRaw struct {
14// Elements []HashRaw `json:"elements"`
15// }
16
17// type QuadraticExtensionRaw = [2]uint64
18
19// type OpeningSetRaw struct {
20// Constants []QuadraticExtensionRaw `json:"constants"`
21// PlonkSigmas []QuadraticExtensionRaw `json:"plonk_sigmas"`
22// Wires []QuadraticExtensionRaw `json:"wires"`
23// PlonkZs []QuadraticExtensionRaw `json:"plonk_zs"`
24// PlonkZsNext []QuadraticExtensionRaw `json:"plonk_zs_next"`
25// PartialProducts []QuadraticExtensionRaw `json:"partial_products"`
26// QuotientPolys []QuadraticExtensionRaw `json:"quotient_polys"`
27// }
28
29// type FriQueryRoundRaw struct {
30// InitialTreesProof struct {
31// EvalsProofs [][]interface{} `json:"evals_proofs"`
32// } `json:"initial_trees_proof"`
33// Steps []uint64 `json:"steps"`
34// }
35
36// type PolynomialCoeffsRaw struct {
37// Coeffs []uint64 `json:"coeffs"`
38// }
39
40// type FriProofRaw struct {
41// CommitPhaseMerkleCaps []MerkleCapRaw `json:"commit_phase_merkle_caps"`
42// QueryRoundProofs FriQueryRoundRaw `json:"query_round_proofs"`
43// FinalPoly PolynomialCoeffsRaw `json:"final_poly"`
44// PowWitness uint64 `json:"pow_witness"`
45// }
46
47// type ProofWithPublicInputsRaw struct {
48// Proof struct {
49// WiresCap MerkleCapRaw `json:"wires_cap"`
50// PlonkZsPartialProductsCap MerkleCapRaw `json:"plonk_zs_partial_products_cap"`
51// QuotientPolysCap MerkleCapRaw `json:"quotient_polys_cap"`
52// Openings OpeningSetRaw `json:"openings"`
53// OpeningProof FriProofRaw `json:"opening_proof"`
54// } `json:"proof"`
55// PublicInputs []uint64 `json:"public_inputs"`
56// }
57
58type ProofWithPublicInputsRaw struct {
59 Proof struct {
60 WiresCap []struct {
61 Elements []uint64 `json:"elements"`
62 } `json:"wires_cap"`
63 PlonkZsPartialProductsCap []struct {
64 Elements []uint64 `json:"elements"`
65 } `json:"plonk_zs_partial_products_cap"`
66 QuotientPolysCap []struct {
67 Elements []uint64 `json:"elements"`
68 } `json:"quotient_polys_cap"`
69 Openings struct {
70 Constants [][]uint64 `json:"constants"`
71 PlonkSigmas [][]uint64 `json:"plonk_sigmas"`
72 Wires [][]uint64 `json:"wires"`
73 PlonkZs [][]uint64 `json:"plonk_zs"`
74 PlonkZsNext [][]uint64 `json:"plonk_zs_next"`
75 PartialProducts [][]uint64 `json:"partial_products"`
76 QuotientPolys [][]uint64 `json:"quotient_polys"`
77 } `json:"openings"`
78 OpeningProof struct {
79 CommitPhaseMerkleCaps []interface{} `json:"commit_phase_merkle_caps"`
80 QueryRoundProofs []struct {
81 InitialTreesProof struct {
82 EvalsProofs [][]interface{} `json:"evals_proofs"`
83 } `json:"initial_trees_proof"`
84 Steps []interface{} `json:"steps"`
85 } `json:"query_round_proofs"`
86 FinalPoly struct {
87 Coeffs [][]uint64 `json:"coeffs"`
88 } `json:"final_poly"`
89 PowWitness uint64 `json:"pow_witness"`
90 } `json:"opening_proof"`
91 } `json:"proof"`
92 PublicInputs []interface{} `json:"public_inputs"`
93}
94
95type CommonCircuitDataRaw struct {
96 Config struct {
97 NumWires uint64 `json:"num_wires"`
98 NumRoutedWires uint64 `json:"num_routed_wires"`
99 NumConstants uint64 `json:"num_constants"`
100 UseBaseArithmeticGate bool `json:"use_base_arithmetic_gate"`
101 SecurityBits uint64 `json:"security_bits"`
102 NumChallenges uint64 `json:"num_challenges"`
103 ZeroKnowledge bool `json:"zero_knowledge"`
104 MaxQuotientDegreeFactor uint64 `json:"max_quotient_degree_factor"`
105 FriConfig struct {
106 RateBits uint64 `json:"rate_bits"`
107 CapHeight uint64 `json:"cap_height"`
108 ProofOfWorkBits uint64 `json:"proof_of_work_bits"`
109 ReductionStrategy struct {
110 ConstantArityBits []uint64 `json:"ConstantArityBits"`
111 } `json:"reduction_strategy"`
112 NumQueryRounds uint64 `json:"num_query_rounds"`
113 } `json:"fri_config"`
114 } `json:"config"`
115 FriParams struct {
116 Config struct {
117 RateBits uint64 `json:"rate_bits"`
118 CapHeight uint64 `json:"cap_height"`
119 ProofOfWorkBits uint64 `json:"proof_of_work_bits"`
120 ReductionStrategy struct {
121 ConstantArityBits []uint64 `json:"ConstantArityBits"`
122 } `json:"reduction_strategy"`
123 NumQueryRounds uint64 `json:"num_query_rounds"`
124 } `json:"config"`
125 Hiding bool `json:"hiding"`
126 DegreeBits uint64 `json:"degree_bits"`
127 ReductionArityBits []interface{} `json:"reduction_arity_bits"`
128 } `json:"fri_params"`
129 DegreeBits uint64 `json:"degree_bits"`
130 SelectorsInfo struct {
131 SelectorIndices []uint64 `json:"selector_indices"`
132 Groups []struct {
133 Start uint64 `json:"start"`
134 End uint64 `json:"end"`
135 } `json:"groups"`
136 } `json:"selectors_info"`
137 QuotientDegreeFactor uint64 `json:"quotient_degree_factor"`
138 NumGateConstraints uint64 `json:"num_gate_constraints"`
139 NumConstants uint64 `json:"num_constants"`
140 NumPublicInputs uint64 `json:"num_public_inputs"`
141 KIs []interface{} `json:"k_is"`
142 NumPartialProducts uint64 `json:"num_partial_products"`
143 CircuitDigest struct {
144 Elements []uint64 `json:"elements"`
145 } `json:"circuit_digest"`
146}
147
148type VerifierOnlyCircuitDataRaw struct {
149 ConstantsSigmasCap []struct {
150 Elements []uint64 `json:"elements"`
151 } `json:"constants_sigmas_cap"`
152}
153
154func DeserializeMerkleCap(merkleCapRaw []struct{ Elements []uint64 }) MerkleCap {
155 n := len(merkleCapRaw)
156 merkleCap := make([]Hash, n)
157 for i := 0; i < n; i++ {
158 copy(merkleCap[i][:], utils.Uint64ArrayToFArray(merkleCapRaw[i].Elements))
159 }
160 return merkleCap
161}
162
163func DeserializeOpeningSet(openingSetRaw struct {
164 Constants [][]uint64
165 PlonkSigmas [][]uint64
166 Wires [][]uint64
167 PlonkZs [][]uint64
168 PlonkZsNext [][]uint64
169 PartialProducts [][]uint64
170 QuotientPolys [][]uint64
171}) OpeningSet {
172 return OpeningSet{
173 Constants: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Constants),
174 PlonkSigmas: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkSigmas),
175 Wires: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Wires),
176 PlonkZs: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZs),
177 PlonkZsNext: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZsNext),
178 PartialProducts: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PartialProducts),
179 QuotientPolys: utils.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.QuotientPolys),
180 }
181}
182
183func DeserializeFriProof(openingProofRaw struct {
184 CommitPhaseMerkleCaps []interface{}
185 QueryRoundProofs []struct {
186 InitialTreesProof struct {
187 EvalsProofs [][]interface{}
188 }
189 Steps []interface{}
190 }
191 FinalPoly struct {
192 Coeffs [][]uint64
193 }
194 PowWitness uint64
195}) FriProof {
196 var openingProof FriProof
197 openingProof.PowWitness = NewFieldElement(openingProofRaw.PowWitness)
198 openingProof.FinalPoly.Coeffs = utils.Uint64ArrayToQuadraticExtensionArray(openingProofRaw.FinalPoly.Coeffs)
199 return openingProof
200}
201
202func DeserializeProofWithPublicInputs(path string) ProofWithPublicInputs {
203 jsonFile, err := os.Open(path)
204 if err != nil {
205 panic(err)
206 }
207
208 defer jsonFile.Close()
209 rawBytes, _ := ioutil.ReadAll(jsonFile)
210
211 var raw ProofWithPublicInputsRaw
212 err = json.Unmarshal(rawBytes, &raw)
213 if err != nil {
214 panic(err)
215 }
216
217 var proofWithPis ProofWithPublicInputs
218 proofWithPis.Proof.WiresCap = DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.Proof.WiresCap))
219 proofWithPis.Proof.PlonkZsPartialProductsCap = DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.Proof.PlonkZsPartialProductsCap))
220 proofWithPis.Proof.QuotientPolysCap = DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.Proof.QuotientPolysCap))
221 proofWithPis.Proof.Openings = DeserializeOpeningSet(struct {
222 Constants [][]uint64
223 PlonkSigmas [][]uint64
224 Wires [][]uint64
225 PlonkZs [][]uint64
226 PlonkZsNext [][]uint64
227 PartialProducts [][]uint64
228 QuotientPolys [][]uint64
229 }(raw.Proof.Openings))
230 proofWithPis.Proof.OpeningProof = DeserializeFriProof(struct {
231 CommitPhaseMerkleCaps []interface{}
232 QueryRoundProofs []struct {
233 InitialTreesProof struct{ EvalsProofs [][]interface{} }
234 Steps []interface{}
235 }
236 FinalPoly struct{ Coeffs [][]uint64 }
237 PowWitness uint64
238 }(raw.Proof.OpeningProof))
239
240 return proofWithPis
241}