arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/plonky2_verifier/fri_test.go
plonky2_verifier/fri_test.goRaw
  1package plonky2_verifier
  2
  3import (
  4	. "gnark-ed25519/field"
  5	"gnark-ed25519/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)
 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		FriQueryIndicies: 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}