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 []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}