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(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.NewFieldElementFromString("14887793628029982930"),
 73				field.NewFieldElementFromString("1136137158284059037"),
 74			},
 75			friAlpha: field.QuadraticExtension{
 76				field.NewFieldElementFromString("14641715242626918707"),
 77				field.NewFieldElementFromString("10574243340537902930"),
 78			},
 79			friBetas:       []field.QuadraticExtension{},
 80			friPOWResponse: field.NewFieldElement(82451580476419),
 81			friQueryIndices: []field.F{
 82				field.NewFieldElement(6790812084677375942),
 83				field.NewFieldElement(12394212020331474798),
 84				field.NewFieldElement(16457600747000998582),
 85				field.NewFieldElement(1543271328932331916),
 86				field.NewFieldElement(12115726870906958644),
 87				field.NewFieldElement(6775897107605342797),
 88				field.NewFieldElement(15989401564746021030),
 89				field.NewFieldElement(10691676456016926845),
 90				field.NewFieldElement(1632499470630032007),
 91				field.NewFieldElement(1317292355445098328),
 92				field.NewFieldElement(18391440812534384252),
 93				field.NewFieldElement(17321705613231354333),
 94				field.NewFieldElement(6176487551308859603),
 95				field.NewFieldElement(7119835651572002873),
 96				field.NewFieldElement(3903019169623116693),
 97				field.NewFieldElement(4886491111111487546),
 98				field.NewFieldElement(4087641893164620518),
 99				field.NewFieldElement(13801643080324181364),
100				field.NewFieldElement(16993775312274189321),
101				field.NewFieldElement(9268202926222765679),
102				field.NewFieldElement(10683001302406181735),
103				field.NewFieldElement(13359465725531647963),
104				field.NewFieldElement(4523327590105620849),
105				field.NewFieldElement(4883588003760409588),
106				field.NewFieldElement(187699146998097671),
107				field.NewFieldElement(14489263557623716717),
108				field.NewFieldElement(11748359318238148146),
109				field.NewFieldElement(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.NewFieldElementFromString("17377750363769967882"),
130				field.NewFieldElementFromString("11921191651424768462"),
131			},
132			friAlpha: field.QuadraticExtension{
133				field.NewFieldElementFromString("16721004555774385479"),
134				field.NewFieldElementFromString("10688151135543754663"),
135			},
136			friBetas: []field.QuadraticExtension{
137				{
138					field.NewFieldElementFromString("3312441922957827805"),
139					field.NewFieldElementFromString("15128092514958289671"),
140				},
141				{
142					field.NewFieldElementFromString("13630530769060141802"),
143					field.NewFieldElementFromString("14559883974933163008"),
144				},
145				{
146					field.NewFieldElementFromString("16146508250083930687"),
147					field.NewFieldElementFromString("5176346568444408396"),
148				},
149			},
150			friPOWResponse: field.NewFieldElement(4389),
151			friQueryIndices: []field.F{
152				field.NewFieldElementFromString("16334967868590615051"),
153				field.NewFieldElementFromString("2911473540496037915"),
154				field.NewFieldElementFromString("14887216056886344225"),
155				field.NewFieldElementFromString("7808811227805914295"),
156				field.NewFieldElementFromString("2018594961417375749"),
157				field.NewFieldElementFromString("3733368398777208435"),
158				field.NewFieldElementFromString("2623035669037055104"),
159				field.NewFieldElementFromString("299243030573481514"),
160				field.NewFieldElementFromString("7189789717962704433"),
161				field.NewFieldElementFromString("14566344026886816268"),
162				field.NewFieldElementFromString("12555390069003437453"),
163				field.NewFieldElementFromString("17225508403199418233"),
164				field.NewFieldElementFromString("5088797913879903292"),
165				field.NewFieldElementFromString("9715691392773433023"),
166				field.NewFieldElementFromString("7565836764713256165"),
167				field.NewFieldElementFromString("1500143546029322929"),
168				field.NewFieldElementFromString("1245802417104422080"),
169				field.NewFieldElementFromString("6831959786661245110"),
170				field.NewFieldElementFromString("17271054758535453780"),
171				field.NewFieldElementFromString("6225460404576395409"),
172				field.NewFieldElementFromString("15932661092896277351"),
173				field.NewFieldElementFromString("12452534049198240575"),
174				field.NewFieldElementFromString("4225199666055520177"),
175				field.NewFieldElementFromString("13235091290587791090"),
176				field.NewFieldElementFromString("2562357622728700774"),
177				field.NewFieldElementFromString("17676678042980201498"),
178				field.NewFieldElementFromString("5837067135702409874"),
179				field.NewFieldElementFromString("11238419549114325157"),
180			},
181		}
182		witness := TestFriCircuit{}
183		err := test.IsSolved(&circuit, &witness, field.TEST_CURVE.ScalarField())
184		assert.NoError(err)
185	}
186
187	testCase()
188}