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