arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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.GoldilocksVariable // 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.GoldilocksVariable, 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.GoldilocksVariable
92}
93
94type FriChallenges struct {
95	FriAlpha        gl.QuadraticExtensionVariable
96	FriBetas        []gl.QuadraticExtensionVariable
97	FriPowResponse  gl.GoldilocksVariable
98	FriQueryIndices []gl.GoldilocksVariable
99}