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 [][]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 []uint64 `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	proofWithPis.PublicInputs = utils.Uint64ArrayToFArray(raw.PublicInputs)
193
194	return proofWithPis
195}
196
197func DeserializeCommonCircuitData(path string) CommonCircuitData {
198	jsonFile, err := os.Open(path)
199	if err != nil {
200		panic(err)
201	}
202
203	defer jsonFile.Close()
204	rawBytes, _ := ioutil.ReadAll(jsonFile)
205
206	var raw CommonCircuitDataRaw
207	err = json.Unmarshal(rawBytes, &raw)
208	if err != nil {
209		panic(err)
210	}
211
212	var commonCircuitData CommonCircuitData
213	commonCircuitData.Config.NumWires = raw.Config.NumWires
214	commonCircuitData.Config.NumRoutedWires = raw.Config.NumRoutedWires
215	commonCircuitData.Config.NumConstants = raw.Config.NumConstants
216	commonCircuitData.Config.UseBaseArithmeticGate = raw.Config.UseBaseArithmeticGate
217	commonCircuitData.Config.SecurityBits = raw.Config.SecurityBits
218	commonCircuitData.Config.NumChallenges = raw.Config.NumChallenges
219	commonCircuitData.Config.ZeroKnowledge = raw.Config.ZeroKnowledge
220	commonCircuitData.Config.MaxQuotientDegreeFactor = raw.Config.MaxQuotientDegreeFactor
221
222	commonCircuitData.Config.FriConfig.RateBits = raw.Config.FriConfig.RateBits
223	commonCircuitData.Config.FriConfig.CapHeight = raw.Config.FriConfig.CapHeight
224	commonCircuitData.Config.FriConfig.ProofOfWorkBits = raw.Config.FriConfig.ProofOfWorkBits
225	commonCircuitData.Config.FriConfig.NumQueryRounds = raw.Config.FriConfig.NumQueryRounds
226
227	commonCircuitData.FriParams.Config.CapHeight = raw.FriParams.Config.CapHeight
228	commonCircuitData.FriParams.Config.CapHeight = raw.FriParams.Config.CapHeight
229	commonCircuitData.FriParams.Config.ProofOfWorkBits = raw.FriParams.Config.ProofOfWorkBits
230	commonCircuitData.FriParams.Config.NumQueryRounds = raw.FriParams.Config.NumQueryRounds
231
232	commonCircuitData.DegreeBits = raw.DegreeBits
233	commonCircuitData.QuotientDegreeFactor = raw.QuotientDegreeFactor
234	commonCircuitData.NumGateConstraints = raw.NumGateConstraints
235	commonCircuitData.NumConstants = raw.NumConstants
236	commonCircuitData.NumPublicInputs = raw.NumPublicInputs
237	commonCircuitData.KIs = utils.Uint64ArrayToFArray(raw.KIs)
238	commonCircuitData.NumPartialProducts = raw.NumPartialProducts
239	copy(commonCircuitData.CircuitDigest[:], utils.Uint64ArrayToFArray(raw.CircuitDigest.Elements))
240
241	return commonCircuitData
242}
243
244func DeserializeVerifierOnlyCircuitData(path string) VerifierOnlyCircuitData {
245	jsonFile, err := os.Open(path)
246	if err != nil {
247		panic(err)
248	}
249
250	defer jsonFile.Close()
251	rawBytes, _ := ioutil.ReadAll(jsonFile)
252
253	var raw VerifierOnlyCircuitDataRaw
254	err = json.Unmarshal(rawBytes, &raw)
255	if err != nil {
256		panic(err)
257	}
258
259	return VerifierOnlyCircuitData{
260		ConstantSigmasCap: DeserializeMerkleCap([]struct{ Elements []uint64 }(raw.ConstantsSigmasCap)),
261	}
262}