arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/variables/fri.go
variables/fri.goRaw
 1package variables
 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 FriMerkleCap = []poseidon.BN254HashOut
17
18func NewFriMerkleCap(capHeight uint64) FriMerkleCap {
19	return make([]poseidon.BN254HashOut, 1<<capHeight)
20}
21
22type FriMerkleProof struct {
23	Siblings []poseidon.BN254HashOut // Length = CircuitConfig.FriConfig.DegreeBits + CircuitConfig.FriConfig.RateBits - CircuitConfig.FriConfig.CapHeight
24}
25
26func NewFriMerkleProof(merkleProofLen uint64) FriMerkleProof {
27	return FriMerkleProof{Siblings: make([]poseidon.BN254HashOut, merkleProofLen)}
28}
29
30type FriEvalProof struct {
31	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]
32	MerkleProof FriMerkleProof
33}
34
35func NewFriEvalProof(elements []gl.Variable, merkleProof FriMerkleProof) FriEvalProof {
36	return FriEvalProof{Elements: elements, MerkleProof: merkleProof}
37}
38
39type FriInitialTreeProof struct {
40	EvalsProofs []FriEvalProof // Length = 4
41}
42
43func NewFriInitialTreeProof(evalsProofs []FriEvalProof) FriInitialTreeProof {
44	return FriInitialTreeProof{EvalsProofs: evalsProofs}
45}
46
47type FriQueryStep struct {
48	Evals       []gl.QuadraticExtensionVariable // Length = [2^arityBit for arityBit in CommonCircuitData.FriParams.ReductionArityBits]
49	MerkleProof FriMerkleProof                  // Length = [regularSize - arityBit for arityBit in CommonCircuitData.FriParams.ReductionArityBits]
50}
51
52func NewFriQueryStep(arityBit uint64, merkleProofLen uint64) FriQueryStep {
53	return FriQueryStep{
54		Evals:       make([]gl.QuadraticExtensionVariable, 1<<arityBit),
55		MerkleProof: NewFriMerkleProof(merkleProofLen),
56	}
57}
58
59type FriQueryRound struct {
60	InitialTreesProof FriInitialTreeProof
61	Steps             []FriQueryStep // Length = Len(CommonCircuitData.FriParams.ReductionArityBits)
62}
63
64func NewFriQueryRound(steps []FriQueryStep, initialTreesProof FriInitialTreeProof) FriQueryRound {
65	return FriQueryRound{InitialTreesProof: initialTreesProof, Steps: steps}
66}
67
68type FriProof struct {
69	CommitPhaseMerkleCaps []FriMerkleCap  // Length = Len(CommonCircuitData.FriParams.ReductionArityBits)
70	QueryRoundProofs      []FriQueryRound // Length = CommonCircuitData.FriConfig.FriParams.NumQueryRounds
71	FinalPoly             PolynomialCoeffs
72	PowWitness            gl.Variable
73}
74
75type FriChallenges struct {
76	FriAlpha        gl.QuadraticExtensionVariable
77	FriBetas        []gl.QuadraticExtensionVariable
78	FriPowResponse  gl.Variable
79	FriQueryIndices []gl.Variable
80}