gnark-plonky2-verifier/verifier/common/types.go
verifier/common/types.goRaw
1package common
2
3import (
4 "github.com/succinctlabs/gnark-plonky2-verifier/field"
5 "github.com/succinctlabs/gnark-plonky2-verifier/poseidon"
6)
7
8type MerkleCap = []poseidon.Hash
9
10func NewMerkleCap(capHeight uint64) MerkleCap {
11 return make([]poseidon.Hash, 1<<capHeight)
12}
13
14type MerkleProof struct {
15 Siblings []poseidon.Hash // Length = CircuitConfig.FriConfig.DegreeBits + CircuitConfig.FriConfig.RateBits - CircuitConfig.FriConfig.CapHeight
16}
17
18func NewMerkleProof(merkleProofLen uint64) MerkleProof {
19 return MerkleProof{Siblings: make([]poseidon.Hash, merkleProofLen)}
20}
21
22type EvalProof struct {
23 Elements []field.F // Length = [CommonCircuitData.Constants + CommonCircuitData.NumRoutedWires, CommonCircuitData.NumWires + CommonCircuitData.FriParams.Hiding ? 4 : 0, CommonCircuitData.NumChallenges * (1 + CommonCircuitData.NumPartialProducts) + salt, CommonCircuitData.NumChallenges * CommonCircuitData.QuotientDegreeFactor + salt]
24 MerkleProof MerkleProof
25}
26
27func NewEvalProof(elements []field.F, merkleProof MerkleProof) EvalProof {
28 return EvalProof{Elements: elements, MerkleProof: merkleProof}
29}
30
31type PolynomialCoeffs struct {
32 Coeffs []field.QuadraticExtension
33}
34
35func NewPolynomialCoeffs(numCoeffs uint64) PolynomialCoeffs {
36 return PolynomialCoeffs{Coeffs: make([]field.QuadraticExtension, numCoeffs)}
37}
38
39type OpeningSet struct {
40 Constants []field.QuadraticExtension // Length = CommonCircuitData.Constants
41 PlonkSigmas []field.QuadraticExtension // Length = CommonCircuitData.NumRoutedWires
42 Wires []field.QuadraticExtension // Length = CommonCircuitData.NumWires
43 PlonkZs []field.QuadraticExtension // Length = CommonCircuitData.NumChallenges
44 PlonkZsNext []field.QuadraticExtension // Length = CommonCircuitData.NumChallenges
45 PartialProducts []field.QuadraticExtension // Length = CommonCircuitData.NumChallenges * CommonCircuitData.NumPartialProducts
46 QuotientPolys []field.QuadraticExtension // Length = CommonCircuitData.NumChallenges * CommonCircuitData.QuotientDegreeFactor
47}
48
49func NewOpeningSet(numConstants uint64, numRoutedWires uint64, numWires uint64, numChallenges uint64, numPartialProducts uint64, quotientDegreeFactor uint64) OpeningSet {
50 return OpeningSet{
51 Constants: make([]field.QuadraticExtension, numConstants),
52 PlonkSigmas: make([]field.QuadraticExtension, numRoutedWires),
53 Wires: make([]field.QuadraticExtension, numWires),
54 PlonkZs: make([]field.QuadraticExtension, numChallenges),
55 PlonkZsNext: make([]field.QuadraticExtension, numChallenges),
56 PartialProducts: make([]field.QuadraticExtension, numChallenges*numPartialProducts),
57 QuotientPolys: make([]field.QuadraticExtension, numChallenges*quotientDegreeFactor),
58 }
59}
60
61type Proof struct {
62 WiresCap MerkleCap // length = 2^CircuitConfig.FriConfig.CapHeight
63 PlonkZsPartialProductsCap MerkleCap // length = 2^CircuitConfig.FriConfig.CapHeight
64 QuotientPolysCap MerkleCap // length = 2^CircuitConfig.FriConfig.CapHeight
65 Openings OpeningSet
66 OpeningProof FriProof
67}
68
69type ProofWithPublicInputs struct {
70 Proof Proof
71 PublicInputs []field.F // Length = CommonCircuitData.NumPublicInputs
72}
73
74type ProofChallenges struct {
75 PlonkBetas []field.F
76 PlonkGammas []field.F
77 PlonkAlphas []field.F
78 PlonkZeta field.QuadraticExtension
79 FriChallenges FriChallenges
80}
81
82type FriInitialTreeProof struct {
83 EvalsProofs []EvalProof // Length = 4
84}
85
86func NewFriInitialTreeProof(evalsProofs []EvalProof) FriInitialTreeProof {
87 return FriInitialTreeProof{EvalsProofs: evalsProofs}
88}
89
90type FriQueryStep struct {
91 Evals []field.QuadraticExtension // Length = [2^arityBit for arityBit in CommonCircuitData.FriParams.ReductionArityBits]
92 MerkleProof MerkleProof // Length = [regularSize - arityBit for arityBit in CommonCircuitData.FriParams.ReductionArityBits]
93}
94
95func NewFriQueryStep(arityBit uint64, merkleProofLen uint64) FriQueryStep {
96 return FriQueryStep{
97 Evals: make([]field.QuadraticExtension, 1<<arityBit),
98 MerkleProof: NewMerkleProof(merkleProofLen),
99 }
100}
101
102type FriQueryRound struct {
103 InitialTreesProof FriInitialTreeProof
104 Steps []FriQueryStep // Length = Len(CommonCircuitData.FriParams.ReductionArityBits)
105}
106
107func NewFriQueryRound(steps []FriQueryStep, initialTreesProof FriInitialTreeProof) FriQueryRound {
108 return FriQueryRound{InitialTreesProof: initialTreesProof, Steps: steps}
109}
110
111type FriProof struct {
112 CommitPhaseMerkleCaps []MerkleCap // Length = Len(CommonCircuitData.FriParams.ReductionArityBits)
113 QueryRoundProofs []FriQueryRound // Length = CommonCircuitData.FriConfig.FriParams.NumQueryRounds
114 FinalPoly PolynomialCoeffs
115 PowWitness field.F
116}
117
118type FriChallenges struct {
119 FriAlpha field.QuadraticExtension
120 FriBetas []field.QuadraticExtension
121 FriPowResponse field.F
122 FriQueryIndices []field.F
123}