arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/variables/deserialize.go
variables/deserialize.goRaw
  1package variables
  2
  3import (
  4	"math/big"
  5
  6	"github.com/consensys/gnark/frontend"
  7	gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks"
  8	"github.com/succinctlabs/gnark-plonky2-verifier/poseidon"
  9	"github.com/succinctlabs/gnark-plonky2-verifier/types"
 10)
 11
 12func DeserializeMerkleCap(merkleCapRaw []string) FriMerkleCap {
 13	n := len(merkleCapRaw)
 14	merkleCap := make([]poseidon.BN254HashOut, n)
 15	for i := 0; i < n; i++ {
 16		capBigInt, _ := new(big.Int).SetString(merkleCapRaw[i], 10)
 17		merkleCap[i] = frontend.Variable(capBigInt)
 18	}
 19	return merkleCap
 20}
 21
 22func DeserializeMerkleProof(merkleProofRaw struct{ Siblings []interface{} }) FriMerkleProof {
 23	n := len(merkleProofRaw.Siblings)
 24	var mp FriMerkleProof
 25	mp.Siblings = make([]poseidon.BN254HashOut, n)
 26	for i := 0; i < n; i++ {
 27		element := merkleProofRaw.Siblings[i].(struct{ Elements []uint64 })
 28		mp.Siblings[i] = gl.Uint64ArrayToVariableArray(element.Elements)
 29	}
 30	return mp
 31}
 32
 33func DeserializeOpeningSet(openingSetRaw struct {
 34	Constants       [][]uint64
 35	PlonkSigmas     [][]uint64
 36	Wires           [][]uint64
 37	PlonkZs         [][]uint64
 38	PlonkZsNext     [][]uint64
 39	PartialProducts [][]uint64
 40	QuotientPolys   [][]uint64
 41}) OpeningSet {
 42	return OpeningSet{
 43		Constants:       gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Constants),
 44		PlonkSigmas:     gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkSigmas),
 45		Wires:           gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.Wires),
 46		PlonkZs:         gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZs),
 47		PlonkZsNext:     gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PlonkZsNext),
 48		PartialProducts: gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.PartialProducts),
 49		QuotientPolys:   gl.Uint64ArrayToQuadraticExtensionArray(openingSetRaw.QuotientPolys),
 50	}
 51}
 52
 53func StringArrayToHashBN254Array(rawHashes []string) []poseidon.BN254HashOut {
 54	hashes := []poseidon.BN254HashOut{}
 55
 56	for i := 0; i < len(rawHashes); i++ {
 57		hashBigInt, _ := new(big.Int).SetString(rawHashes[i], 10)
 58		hashVar := frontend.Variable(hashBigInt)
 59		hashes = append(hashes, poseidon.BN254HashOut(hashVar))
 60	}
 61
 62	return hashes
 63}
 64
 65func DeserializeFriProof(openingProofRaw struct {
 66	CommitPhaseMerkleCaps [][]string
 67	QueryRoundProofs      []struct {
 68		InitialTreesProof struct {
 69			EvalsProofs []types.EvalProofRaw
 70		}
 71		Steps []struct {
 72			Evals       [][]uint64
 73			MerkleProof struct {
 74				Siblings []string
 75			}
 76		}
 77	}
 78	FinalPoly struct {
 79		Coeffs [][]uint64
 80	}
 81	PowWitness uint64
 82}) FriProof {
 83	var openingProof FriProof
 84	openingProof.PowWitness = gl.NewVariable(openingProofRaw.PowWitness)
 85	openingProof.FinalPoly.Coeffs = gl.Uint64ArrayToQuadraticExtensionArray(openingProofRaw.FinalPoly.Coeffs)
 86
 87	openingProof.CommitPhaseMerkleCaps = make([]FriMerkleCap, len(openingProofRaw.CommitPhaseMerkleCaps))
 88	for i := 0; i < len(openingProofRaw.CommitPhaseMerkleCaps); i++ {
 89		openingProof.CommitPhaseMerkleCaps[i] = StringArrayToHashBN254Array(openingProofRaw.CommitPhaseMerkleCaps[i])
 90	}
 91
 92	numQueryRoundProofs := len(openingProofRaw.QueryRoundProofs)
 93	openingProof.QueryRoundProofs = make([]FriQueryRound, numQueryRoundProofs)
 94
 95	for i := 0; i < numQueryRoundProofs; i++ {
 96		numEvalProofs := len(openingProofRaw.QueryRoundProofs[i].InitialTreesProof.EvalsProofs)
 97		openingProof.QueryRoundProofs[i].InitialTreesProof.EvalsProofs = make([]FriEvalProof, numEvalProofs)
 98		for j := 0; j < numEvalProofs; j++ {
 99			openingProof.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].Elements = gl.Uint64ArrayToVariableArray(openingProofRaw.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].LeafElements)
100			openingProof.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].MerkleProof.Siblings = StringArrayToHashBN254Array(openingProofRaw.QueryRoundProofs[i].InitialTreesProof.EvalsProofs[j].MerkleProof.Hash)
101		}
102
103		numSteps := len(openingProofRaw.QueryRoundProofs[i].Steps)
104		openingProof.QueryRoundProofs[i].Steps = make([]FriQueryStep, numSteps)
105		for j := 0; j < numSteps; j++ {
106			openingProof.QueryRoundProofs[i].Steps[j].Evals = gl.Uint64ArrayToQuadraticExtensionArray(openingProofRaw.QueryRoundProofs[i].Steps[j].Evals)
107			openingProof.QueryRoundProofs[i].Steps[j].MerkleProof.Siblings = StringArrayToHashBN254Array(openingProofRaw.QueryRoundProofs[i].Steps[j].MerkleProof.Siblings)
108		}
109	}
110
111	return openingProof
112}
113
114func DeserializeProofWithPublicInputs(raw types.ProofWithPublicInputsRaw) ProofWithPublicInputs {
115	var proofWithPis ProofWithPublicInputs
116	proofWithPis.Proof.WiresCap = DeserializeMerkleCap(raw.Proof.WiresCap)
117	proofWithPis.Proof.PlonkZsPartialProductsCap = DeserializeMerkleCap(raw.Proof.PlonkZsPartialProductsCap)
118	proofWithPis.Proof.QuotientPolysCap = DeserializeMerkleCap(raw.Proof.QuotientPolysCap)
119	proofWithPis.Proof.Openings = DeserializeOpeningSet(struct {
120		Constants       [][]uint64
121		PlonkSigmas     [][]uint64
122		Wires           [][]uint64
123		PlonkZs         [][]uint64
124		PlonkZsNext     [][]uint64
125		PartialProducts [][]uint64
126		QuotientPolys   [][]uint64
127	}(raw.Proof.Openings))
128	proofWithPis.Proof.OpeningProof = DeserializeFriProof(struct {
129		CommitPhaseMerkleCaps [][]string
130		QueryRoundProofs      []struct {
131			InitialTreesProof struct {
132				EvalsProofs []types.EvalProofRaw
133			}
134			Steps []struct {
135				Evals       [][]uint64
136				MerkleProof struct {
137					Siblings []string
138				}
139			}
140		}
141		FinalPoly  struct{ Coeffs [][]uint64 }
142		PowWitness uint64
143	}(raw.Proof.OpeningProof))
144	proofWithPis.PublicInputs = gl.Uint64ArrayToVariableArray(raw.PublicInputs)
145
146	return proofWithPis
147}
148
149func DeserializeVerifierOnlyCircuitData(raw types.VerifierOnlyCircuitDataRaw) VerifierOnlyCircuitData {
150	var verifierOnlyCircuitData VerifierOnlyCircuitData
151	verifierOnlyCircuitData.ConstantSigmasCap = DeserializeMerkleCap(raw.ConstantsSigmasCap)
152	circuitDigestBigInt, _ := new(big.Int).SetString(raw.CircuitDigest, 10)
153	circuitDigestVar := frontend.Variable(circuitDigestBigInt)
154	verifierOnlyCircuitData.CircuitDigest = poseidon.BN254HashOut(circuitDigestVar)
155	return verifierOnlyCircuitData
156}