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