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}