gnark-plonky2-verifier/types/fri.go
types/fri.goRaw
1package types
2
3import (
4 gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks"
5 "github.com/succinctlabs/gnark-plonky2-verifier/poseidon"
6)
7
8type PolynomialCoeffs struct {
9 Coeffs []gl.QuadraticExtensionVariable
10}
11
12func NewPolynomialCoeffs(numCoeffs uint64) PolynomialCoeffs {
13 return PolynomialCoeffs{Coeffs: make([]gl.QuadraticExtensionVariable, numCoeffs)}
14}
15
16type FriConfig struct {
17 RateBits uint64
18 CapHeight uint64
19 ProofOfWorkBits uint64
20 NumQueryRounds uint64
21 // TODO: add FriReductionStrategy
22}
23
24func (fc *FriConfig) Rate() float64 {
25 return 1.0 / float64((uint64(1) << fc.RateBits))
26}
27
28type FriParams struct {
29 Config FriConfig
30 Hiding bool
31 DegreeBits uint64
32 ReductionArityBits []uint64
33}
34
35type FriMerkleCap = []poseidon.BN254HashOut
36
37func NewFriMerkleCap(capHeight uint64) FriMerkleCap {
38 return make([]poseidon.BN254HashOut, 1<<capHeight)
39}
40
41type FriMerkleProof struct {
42 Siblings []poseidon.BN254HashOut // Length = CircuitConfig.FriConfig.DegreeBits + CircuitConfig.FriConfig.RateBits - CircuitConfig.FriConfig.CapHeight
43}
44
45func NewFriMerkleProof(merkleProofLen uint64) FriMerkleProof {
46 return FriMerkleProof{Siblings: make([]poseidon.BN254HashOut, merkleProofLen)}
47}
48
49type FriEvalProof struct {
50 Elements []gl.Variable // Length = [CommonCircuitData.Constants + CommonCircuitData.NumRoutedWires, CommonCircuitData.NumWires + CommonCircuitData.FriParams.Hiding ? 4 : 0, CommonCircuitData.NumChallenges * (1 + CommonCircuitData.NumPartialProducts) + salt, CommonCircuitData.NumChallenges * CommonCircuitData.QuotientDegreeFactor + salt]
51 MerkleProof FriMerkleProof
52}
53
54func NewFriEvalProof(elements []gl.Variable, merkleProof FriMerkleProof) FriEvalProof {
55 return FriEvalProof{Elements: elements, MerkleProof: merkleProof}
56}
57
58type FriInitialTreeProof struct {
59 EvalsProofs []FriEvalProof // Length = 4
60}
61
62func NewFriInitialTreeProof(evalsProofs []FriEvalProof) FriInitialTreeProof {
63 return FriInitialTreeProof{EvalsProofs: evalsProofs}
64}
65
66type FriQueryStep struct {
67 Evals []gl.QuadraticExtensionVariable // Length = [2^arityBit for arityBit in CommonCircuitData.FriParams.ReductionArityBits]
68 MerkleProof FriMerkleProof // Length = [regularSize - arityBit for arityBit in CommonCircuitData.FriParams.ReductionArityBits]
69}
70
71func NewFriQueryStep(arityBit uint64, merkleProofLen uint64) FriQueryStep {
72 return FriQueryStep{
73 Evals: make([]gl.QuadraticExtensionVariable, 1<<arityBit),
74 MerkleProof: NewFriMerkleProof(merkleProofLen),
75 }
76}
77
78type FriQueryRound struct {
79 InitialTreesProof FriInitialTreeProof
80 Steps []FriQueryStep // Length = Len(CommonCircuitData.FriParams.ReductionArityBits)
81}
82
83func NewFriQueryRound(steps []FriQueryStep, initialTreesProof FriInitialTreeProof) FriQueryRound {
84 return FriQueryRound{InitialTreesProof: initialTreesProof, Steps: steps}
85}
86
87type FriProof struct {
88 CommitPhaseMerkleCaps []FriMerkleCap // Length = Len(CommonCircuitData.FriParams.ReductionArityBits)
89 QueryRoundProofs []FriQueryRound // Length = CommonCircuitData.FriConfig.FriParams.NumQueryRounds
90 FinalPoly PolynomialCoeffs
91 PowWitness gl.Variable
92}
93
94type FriChallenges struct {
95 FriAlpha gl.QuadraticExtensionVariable
96 FriBetas []gl.QuadraticExtensionVariable
97 FriPowResponse gl.Variable
98 FriQueryIndices []gl.Variable
99}