arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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}