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