arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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.PoseidonBN128HashOut
  9
 10func NewMerkleCap(capHeight uint64) MerkleCap {
 11	return make([]poseidon.PoseidonBN128HashOut, 1<<capHeight)
 12}
 13
 14type MerkleProof struct {
 15	Siblings []poseidon.PoseidonBN128HashOut // Length = CircuitConfig.FriConfig.DegreeBits + CircuitConfig.FriConfig.RateBits - CircuitConfig.FriConfig.CapHeight
 16}
 17
 18func NewMerkleProof(merkleProofLen uint64) MerkleProof {
 19	return MerkleProof{Siblings: make([]poseidon.PoseidonBN128HashOut, 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}