gnark-plonky2-verifier/plonky2_verifier/fri_test.go
plonky2_verifier/fri_test.goRaw
1package plonky2_verifier
2
3import (
4 . "gnark-plonky2-verifier/field"
5 "gnark-plonky2-verifier/poseidon"
6 "testing"
7
8 "github.com/consensys/gnark/frontend"
9 "github.com/consensys/gnark/test"
10)
11
12type TestFriCircuit struct {
13 proofWithPIsFilename string `gnark:"-"`
14 commonCircuitDataFilename string `gnark:"-"`
15 verifierOnlyCircuitDataFilename string `gnark:"-"`
16
17 plonkZeta QuadraticExtension
18 friAlpha QuadraticExtension
19 friBetas []QuadraticExtension
20 friPOWResponse F
21 friQueryIndices []F
22}
23
24func (circuit *TestFriCircuit) Define(api frontend.API) error {
25 proofWithPis := DeserializeProofWithPublicInputs(circuit.proofWithPIsFilename)
26 commonCircuitData := DeserializeCommonCircuitData(circuit.commonCircuitDataFilename)
27 verifierOnlyCircuitData := DeserializeVerifierOnlyCircuitData(circuit.verifierOnlyCircuitDataFilename)
28
29 fieldAPI := NewFieldAPI(api)
30 qeAPI := NewQuadraticExtensionAPI(fieldAPI, commonCircuitData.DegreeBits)
31 hashAPI := NewHashAPI(fieldAPI)
32 poseidonChip := poseidon.NewPoseidonChip(api, fieldAPI, qeAPI)
33 friChip := NewFriChip(api, fieldAPI, qeAPI, hashAPI, poseidonChip, &commonCircuitData.FriParams)
34
35 friChallenges := FriChallenges{
36 FriAlpha: circuit.friAlpha,
37 FriBetas: circuit.friBetas,
38 FriPowResponse: circuit.friPOWResponse,
39 FriQueryIndices: circuit.friQueryIndices,
40 }
41
42 initialMerkleCaps := []MerkleCap{
43 verifierOnlyCircuitData.ConstantSigmasCap,
44 proofWithPis.Proof.WiresCap,
45 proofWithPis.Proof.PlonkZsPartialProductsCap,
46 proofWithPis.Proof.QuotientPolysCap,
47 }
48
49 friChip.VerifyFriProof(
50 commonCircuitData.GetFriInstance(qeAPI, circuit.plonkZeta, commonCircuitData.DegreeBits),
51 proofWithPis.Proof.Openings.ToFriOpenings(),
52 &friChallenges,
53 initialMerkleCaps,
54 &proofWithPis.Proof.OpeningProof,
55 )
56
57 return nil
58}
59
60func TestFibonacciFriProof(t *testing.T) {
61 assert := test.NewAssert(t)
62
63 testCase := func() {
64 circuit := TestFriCircuit{
65 proofWithPIsFilename: "./data/fibonacci/proof_with_public_inputs.json",
66 commonCircuitDataFilename: "./data/fibonacci/common_circuit_data.json",
67 verifierOnlyCircuitDataFilename: "./data/fibonacci/verifier_only_circuit_data.json",
68 plonkZeta: QuadraticExtension{
69 NewFieldElementFromString("14887793628029982930"),
70 NewFieldElementFromString("1136137158284059037"),
71 },
72 friAlpha: QuadraticExtension{
73 NewFieldElementFromString("14641715242626918707"),
74 NewFieldElementFromString("10574243340537902930"),
75 },
76 friBetas: []QuadraticExtension{},
77 friPOWResponse: NewFieldElement(82451580476419),
78 friQueryIndices: []F{
79 NewFieldElement(6790812084677375942),
80 NewFieldElement(12394212020331474798),
81 NewFieldElement(16457600747000998582),
82 NewFieldElement(1543271328932331916),
83 NewFieldElement(12115726870906958644),
84 NewFieldElement(6775897107605342797),
85 NewFieldElement(15989401564746021030),
86 NewFieldElement(10691676456016926845),
87 NewFieldElement(1632499470630032007),
88 NewFieldElement(1317292355445098328),
89 NewFieldElement(18391440812534384252),
90 NewFieldElement(17321705613231354333),
91 NewFieldElement(6176487551308859603),
92 NewFieldElement(7119835651572002873),
93 NewFieldElement(3903019169623116693),
94 NewFieldElement(4886491111111487546),
95 NewFieldElement(4087641893164620518),
96 NewFieldElement(13801643080324181364),
97 NewFieldElement(16993775312274189321),
98 NewFieldElement(9268202926222765679),
99 NewFieldElement(10683001302406181735),
100 NewFieldElement(13359465725531647963),
101 NewFieldElement(4523327590105620849),
102 NewFieldElement(4883588003760409588),
103 NewFieldElement(187699146998097671),
104 NewFieldElement(14489263557623716717),
105 NewFieldElement(11748359318238148146),
106 NewFieldElement(13636347200053048758),
107 },
108 }
109 witness := TestFriCircuit{}
110 err := test.IsSolved(&circuit, &witness, TEST_CURVE.ScalarField())
111 assert.NoError(err)
112 }
113
114 testCase()
115}
116
117func TestDummyFriProof(t *testing.T) {
118 assert := test.NewAssert(t)
119
120 testCase := func() {
121 circuit := TestFriCircuit{
122 proofWithPIsFilename: "./data/dummy_2^14_gates/proof_with_public_inputs.json",
123 commonCircuitDataFilename: "./data/dummy_2^14_gates/common_circuit_data.json",
124 verifierOnlyCircuitDataFilename: "./data/dummy_2^14_gates/verifier_only_circuit_data.json",
125 plonkZeta: QuadraticExtension{
126 NewFieldElementFromString("17377750363769967882"),
127 NewFieldElementFromString("11921191651424768462"),
128 },
129 friAlpha: QuadraticExtension{
130 NewFieldElementFromString("16721004555774385479"),
131 NewFieldElementFromString("10688151135543754663"),
132 },
133 friBetas: []QuadraticExtension{
134 {
135 NewFieldElementFromString("3312441922957827805"),
136 NewFieldElementFromString("15128092514958289671"),
137 },
138 {
139 NewFieldElementFromString("13630530769060141802"),
140 NewFieldElementFromString("14559883974933163008"),
141 },
142 {
143 NewFieldElementFromString("16146508250083930687"),
144 NewFieldElementFromString("5176346568444408396"),
145 },
146 },
147 friPOWResponse: NewFieldElement(4389),
148 friQueryIndices: []F{
149 NewFieldElementFromString("16334967868590615051"),
150 NewFieldElementFromString("2911473540496037915"),
151 NewFieldElementFromString("14887216056886344225"),
152 NewFieldElementFromString("7808811227805914295"),
153 NewFieldElementFromString("2018594961417375749"),
154 NewFieldElementFromString("3733368398777208435"),
155 NewFieldElementFromString("2623035669037055104"),
156 NewFieldElementFromString("299243030573481514"),
157 NewFieldElementFromString("7189789717962704433"),
158 NewFieldElementFromString("14566344026886816268"),
159 NewFieldElementFromString("12555390069003437453"),
160 NewFieldElementFromString("17225508403199418233"),
161 NewFieldElementFromString("5088797913879903292"),
162 NewFieldElementFromString("9715691392773433023"),
163 NewFieldElementFromString("7565836764713256165"),
164 NewFieldElementFromString("1500143546029322929"),
165 NewFieldElementFromString("1245802417104422080"),
166 NewFieldElementFromString("6831959786661245110"),
167 NewFieldElementFromString("17271054758535453780"),
168 NewFieldElementFromString("6225460404576395409"),
169 NewFieldElementFromString("15932661092896277351"),
170 NewFieldElementFromString("12452534049198240575"),
171 NewFieldElementFromString("4225199666055520177"),
172 NewFieldElementFromString("13235091290587791090"),
173 NewFieldElementFromString("2562357622728700774"),
174 NewFieldElementFromString("17676678042980201498"),
175 NewFieldElementFromString("5837067135702409874"),
176 NewFieldElementFromString("11238419549114325157"),
177 },
178 }
179 witness := TestFriCircuit{}
180 err := test.IsSolved(&circuit, &witness, TEST_CURVE.ScalarField())
181 assert.NoError(err)
182 }
183
184 testCase()
185}