package variables import ( "math/big" "github.com/consensys/gnark/frontend" gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks" "github.com/succinctlabs/gnark-plonky2-verifier/poseidon" "github.com/succinctlabs/gnark-plonky2-verifier/types" ) func DeserializeMerkleCap(merkleCapRaw []string) FriMerkleCap { n := len(merkleCapRaw) merkleCap := make([]poseidon.BN254HashOut, n) for i := 0; i < n; i++ { capBigInt, _ := new(big.Int).SetString(merkleCapRaw[i], 10) merkleCap[i] = frontend.Variable(capBigInt) } return merkleCap } func DeserializeMerkleProof(merkleProofRaw struct{ Siblings []interface{} }) FriMerkleProof { n := len(merkleProofRaw.Siblings) var mp FriMerkleProof mp.Siblings = make([]poseidon.BN254HashOut, n) for i := 0; i < n; i++ { element := merkleProofRaw.Siblings[i].(struct{ Elements []uint64 }) mp.Siblings[i] = gl.Uint64ArrayToVariableArray(element.Elements) } return mp } func DeserializeOpeningSet(openingSetRaw struct { Constants [][]uint64 PlonkSigmas [][]uint64 Wires [][]uint64 PlonkZs [][]uint64 PlonkZsNext [][]uint64 PartialProducts [][]uint64 QuotientPolys [][]uint64 }) OpeningSet { return OpeningSet{ Constants: gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Constants), PlonkSigmas: gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkSigmas), Wires: gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Wires), PlonkZs: gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZs), PlonkZsNext: gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZsNext), PartialProducts: gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PartialProducts), QuotientPolys: gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.QuotientPolys), } } func StringArrayToHashBN254Array(rawHashes []string) []poseidon.BN254HashOut { hashes := []poseidon.BN254HashOut{} for i := 0; i < len(rawHashes); i++ { hashBigInt, _ := new(big.Int).SetString(rawHashes[i], 10) hashVar := frontend.Variable(hashBigInt) hashes = append(hashes, poseidon.BN254HashOut(hashVar)) } return hashes } func DeserializeFriProof(openingProofRaw struct { CommitPhaseMerkleCaps [][]string QueryRoundProofs []struct { InitialTreesProof struct { EvalsProofs []types.EvalProofRaw } Steps []struct { Evals [][]uint64 MerkleProof struct { Siblings []string } } } FinalPoly struct { Coeffs [][]uint64 } PowWitness uint64 }) FriProof { var openingProof FriProof openingProof.PowWitness = gl.NewVariable(openingProofRaw.PowWitness) openingProof.FinalPoly.Coeffs = gl.Uint64ArrayToQuadraticExtensionArray(openingProofRaw.FinalPoly.Coeffs) openingProof.CommitPhaseMerkleCaps = make([]FriMerkleCap, len(openingProofRaw.CommitPhaseMerkleCaps)) for i := 0; i < len(openingProofRaw.CommitPhaseMerkleCaps); i++ { openingProof.CommitPhaseMerkleCaps[i] = StringArrayToHashBN254Array(openingProofRaw.CommitPhaseMerkleCaps[i]) } numQueryRoundProofs := len(openingProofRaw.QueryRoundProofs) openingProof.QueryRoundProofs = make([]FriQueryRound, numQueryRoundProofs) for i := 0; i < numQueryRoundProofs; i++ { numEvalProofs := len(openingProofRaw.QueryRoundProofs[i].InitialTreesProof.EvalsProofs) openingProof.QueryRoundProofs[i].InitialTreesProof.EvalsProofs = make([]FriEvalProof, numEvalProofs) for j := 0; j < numEvalProofs; j++ { openingProof.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].Elements = gl.Uint64ArrayToVariableArray(openingProofRaw.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].LeafElements) openingProof.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].MerkleProof.Siblings = StringArrayToHashBN254Array(openingProofRaw.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].MerkleProof.Hash) } numSteps := len(openingProofRaw.QueryRoundProofs[i].Steps) openingProof.QueryRoundProofs[i].Steps = make([]FriQueryStep, numSteps) for j := 0; j < numSteps; j++ { openingProof.QueryRoundProofs[i].Steps[j].Evals = gl.Uint64ArrayToQuadraticExtensionArray(openingProofRaw.QueryRoundProofs[i].Steps[j].Evals) openingProof.QueryRoundProofs[i].Steps[j].MerkleProof.Siblings = StringArrayToHashBN254Array(openingProofRaw.QueryRoundProofs[i].Steps[j].MerkleProof.Siblings) } } return openingProof } func DeserializeProofWithPublicInputs(raw types.ProofWithPublicInputsRaw) ProofWithPublicInputs { var proofWithPis ProofWithPublicInputs proofWithPis.Proof.WiresCap = DeserializeMerkleCap(raw.Proof.WiresCap) proofWithPis.Proof.PlonkZsPartialProductsCap = DeserializeMerkleCap(raw.Proof.PlonkZsPartialProductsCap) proofWithPis.Proof.QuotientPolysCap = DeserializeMerkleCap(raw.Proof.QuotientPolysCap) proofWithPis.Proof.Openings = DeserializeOpeningSet(struct { Constants [][]uint64 PlonkSigmas [][]uint64 Wires [][]uint64 PlonkZs [][]uint64 PlonkZsNext [][]uint64 PartialProducts [][]uint64 QuotientPolys [][]uint64 }(raw.Proof.Openings)) proofWithPis.Proof.OpeningProof = DeserializeFriProof(struct { CommitPhaseMerkleCaps [][]string QueryRoundProofs []struct { InitialTreesProof struct { EvalsProofs []types.EvalProofRaw } Steps []struct { Evals [][]uint64 MerkleProof struct { Siblings []string } } } FinalPoly struct{ Coeffs [][]uint64 } PowWitness uint64 }(raw.Proof.OpeningProof)) proofWithPis.PublicInputs = gl.Uint64ArrayToVariableArray(raw.PublicInputs) return proofWithPis } func DeserializeVerifierOnlyCircuitData(raw types.VerifierOnlyCircuitDataRaw) VerifierOnlyCircuitData { var verifierOnlyCircuitData VerifierOnlyCircuitData verifierOnlyCircuitData.ConstantSigmasCap = DeserializeMerkleCap(raw.ConstantsSigmasCap) circuitDigestBigInt, _ := new(big.Int).SetString(raw.CircuitDigest, 10) circuitDigestVar := frontend.Variable(circuitDigestBigInt) verifierOnlyCircuitData.CircuitDigest = poseidon.BN254HashOut(circuitDigestVar) return verifierOnlyCircuitData }