mirror of
https://github.com/arnaucube/gnark-plonky2-verifier.git
synced 2026-01-12 09:01:32 +01:00
added verifier_test
This commit is contained in:
@@ -174,20 +174,13 @@ func (p *PlonkChip) evalVanishingPoly(proofChallenges ProofChallenges, openings
|
||||
}
|
||||
|
||||
vanishingTerms := append(vanishingZ1Terms, vanishingPartialProductsTerms...)
|
||||
vanishingTerms = append(vanishingTerms, []QuadraticExtension{p.qeAPI.ZERO_QE, p.qeAPI.ZERO_QE, p.qeAPI.ZERO_QE, p.qeAPI.ZERO_QE}...)
|
||||
|
||||
reducedValues := make([]QuadraticExtension, p.commonData.Config.NumChallenges)
|
||||
for i := uint64(0); i < p.commonData.Config.NumChallenges; i++ {
|
||||
reducedValues[i] = p.qeAPI.ZERO_QE
|
||||
}
|
||||
|
||||
// TODO: Enable this check once the custom gate evaluations are added to the
|
||||
// vanishingTerms array
|
||||
/*
|
||||
if len(vanishingTerms) != int(p.commonData.QuotientDegreeFactor) {
|
||||
panic("evalVanishingPoly: len(vanishingTerms) != int(p.commonData.QuotientDegreeFactor)")
|
||||
}
|
||||
*/
|
||||
|
||||
// reverse iterate the vanishingPartialProductsTerms array
|
||||
for i := len(vanishingTerms) - 1; i >= 0; i-- {
|
||||
for j := uint64(0); j < p.commonData.Config.NumChallenges; j++ {
|
||||
@@ -219,8 +212,8 @@ func (p *PlonkChip) Verify(proofChallenges ProofChallenges, openings OpeningSet)
|
||||
// So to reconstruct `t(zeta)` we can compute `reduce_with_powers(chunk, zeta^n)` for each
|
||||
// `quotient_degree_factor`-sized chunk of the original evaluations.
|
||||
for i := 0; i < len(vanishingPolysZeta); i++ {
|
||||
quotientPolysStartIdx := i * len(vanishingPolysZeta)
|
||||
quotientPolysEndIdx := quotientPolysStartIdx + len(vanishingPolysZeta)
|
||||
quotientPolysStartIdx := i * int(p.commonData.QuotientDegreeFactor)
|
||||
quotientPolysEndIdx := quotientPolysStartIdx + int(p.commonData.QuotientDegreeFactor)
|
||||
prod := p.qeAPI.MulExtension(
|
||||
zHZeta,
|
||||
p.qeAPI.ReduceWithPowers(
|
||||
@@ -229,13 +222,6 @@ func (p *PlonkChip) Verify(proofChallenges ProofChallenges, openings OpeningSet)
|
||||
),
|
||||
)
|
||||
|
||||
// TODO: Uncomment this after adding in the custom gates evaluations
|
||||
//p.qeAPI.AssertIsEqual(vanishingPolysZeta[i], prod)
|
||||
|
||||
// For now, just put in a dummy equality check so that VS stops complaining about unused variables
|
||||
p.qeAPI.AssertIsEqual(
|
||||
p.qeAPI.MulExtension(vanishingPolysZeta[i], p.qeAPI.ZERO_QE),
|
||||
p.qeAPI.MulExtension(prod, p.qeAPI.ZERO_QE),
|
||||
)
|
||||
p.qeAPI.AssertIsEqual(vanishingPolysZeta[i], prod)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,6 +82,25 @@ func (c *VerifierChip) Verify(proofWithPis ProofWithPublicInputs, verifierData V
|
||||
proofWithPis.Proof.QuotientPolysCap,
|
||||
}
|
||||
|
||||
// Seems like there is a bug in the emulated field code.
|
||||
// Add ZERO to all of the fri challenges values to reduce them.
|
||||
proofChallenges.PlonkZeta[0] = c.fieldAPI.Add(proofChallenges.PlonkZeta[0], ZERO_F).(F)
|
||||
proofChallenges.PlonkZeta[1] = c.fieldAPI.Add(proofChallenges.PlonkZeta[1], ZERO_F).(F)
|
||||
|
||||
proofChallenges.FriChallenges.FriAlpha[0] = c.fieldAPI.Add(proofChallenges.FriChallenges.FriAlpha[0], ZERO_F).(F)
|
||||
proofChallenges.FriChallenges.FriAlpha[1] = c.fieldAPI.Add(proofChallenges.FriChallenges.FriAlpha[1], ZERO_F).(F)
|
||||
|
||||
for i := 0; i < len(proofChallenges.FriChallenges.FriBetas); i++ {
|
||||
proofChallenges.FriChallenges.FriBetas[i][0] = c.fieldAPI.Add(proofChallenges.FriChallenges.FriBetas[i][0], ZERO_F).(F)
|
||||
proofChallenges.FriChallenges.FriBetas[i][1] = c.fieldAPI.Add(proofChallenges.FriChallenges.FriBetas[i][1], ZERO_F).(F)
|
||||
}
|
||||
|
||||
proofChallenges.FriChallenges.FriPowResponse = c.fieldAPI.Add(proofChallenges.FriChallenges.FriPowResponse, ZERO_F).(F)
|
||||
|
||||
for i := 0; i < len(proofChallenges.FriChallenges.FriQueryIndicies); i++ {
|
||||
proofChallenges.FriChallenges.FriQueryIndicies[i] = c.fieldAPI.Add(proofChallenges.FriChallenges.FriQueryIndicies[i], ZERO_F).(F)
|
||||
}
|
||||
|
||||
c.friChip.VerifyFriProof(
|
||||
commonData.GetFriInstance(c.qeAPI, proofChallenges.PlonkZeta, commonData.DegreeBits),
|
||||
proofWithPis.Proof.Openings.ToFriOpenings(),
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"github.com/consensys/gnark/test"
|
||||
)
|
||||
|
||||
type TestVerifierCircuit struct {
|
||||
type TestVerifierChallengesCircuit struct {
|
||||
fieldAPI frontend.API `gnark:"-"`
|
||||
qeAPI *QuadraticExtensionAPI `gnark:"-"`
|
||||
hashAPI *HashAPI `gnark:"-"`
|
||||
@@ -35,7 +35,7 @@ type TestVerifierCircuit struct {
|
||||
verifierChip *VerifierChip
|
||||
}
|
||||
|
||||
func (c *TestVerifierCircuit) GetChallengesSanityCheck(
|
||||
func (c *TestVerifierChallengesCircuit) GetChallengesSanityCheck(
|
||||
proofWithPis ProofWithPublicInputs,
|
||||
verifierData VerifierOnlyCircuitData,
|
||||
commonData CommonCircuitData,
|
||||
@@ -90,7 +90,7 @@ func (c *TestVerifierCircuit) GetChallengesSanityCheck(
|
||||
}
|
||||
}
|
||||
|
||||
func (c *TestVerifierCircuit) Define(api frontend.API) error {
|
||||
func (c *TestVerifierChallengesCircuit) Define(api frontend.API) error {
|
||||
proofWithPis := DeserializeProofWithPublicInputs(c.proofWithPIsFilename)
|
||||
commonCircuitData := DeserializeCommonCircuitData(c.commonCircuitDataFilename)
|
||||
verfierOnlyCircuitData := DeserializeVerifierOnlyCircuitData(c.verifierOnlyCircuitDataFilename)
|
||||
@@ -112,7 +112,7 @@ func TestFibonacciVerifierWitness(t *testing.T) {
|
||||
assert := test.NewAssert(t)
|
||||
|
||||
testCase := func() {
|
||||
circuit := TestVerifierCircuit{
|
||||
circuit := TestVerifierChallengesCircuit{
|
||||
proofWithPIsFilename: "./data/fibonacci/proof_with_public_inputs.json",
|
||||
commonCircuitDataFilename: "./data/fibonacci/common_circuit_data.json",
|
||||
verifierOnlyCircuitDataFilename: "./data/fibonacci/verifier_only_circuit_data.json",
|
||||
@@ -183,7 +183,7 @@ func TestFibonacciVerifierWitness(t *testing.T) {
|
||||
NewFieldElement(13636347200053048758),
|
||||
},
|
||||
}
|
||||
witness := TestVerifierCircuit{}
|
||||
witness := TestVerifierChallengesCircuit{}
|
||||
err := test.IsSolved(&circuit, &witness, TEST_CURVE.ScalarField())
|
||||
assert.NoError(err)
|
||||
}
|
||||
@@ -195,7 +195,7 @@ func TestDummyVerifierWitness(t *testing.T) {
|
||||
assert := test.NewAssert(t)
|
||||
|
||||
testCase := func() {
|
||||
circuit := TestVerifierCircuit{
|
||||
circuit := TestVerifierChallengesCircuit{
|
||||
proofWithPIsFilename: "./data/dummy_2^14_gates/proof_with_public_inputs.json",
|
||||
commonCircuitDataFilename: "./data/dummy_2^14_gates/common_circuit_data.json",
|
||||
verifierOnlyCircuitDataFilename: "./data/dummy_2^14_gates/verifier_only_circuit_data.json",
|
||||
@@ -279,10 +279,56 @@ func TestDummyVerifierWitness(t *testing.T) {
|
||||
NewFieldElement(11238419549114325157),
|
||||
},
|
||||
}
|
||||
witness := TestVerifierCircuit{} // No real witness as the test circuit's Define function will inject in the witness
|
||||
witness := TestVerifierChallengesCircuit{} // No real witness as the test circuit's Define function will inject in the witness
|
||||
err := test.IsSolved(&circuit, &witness, TEST_CURVE.ScalarField())
|
||||
assert.NoError(err)
|
||||
}
|
||||
|
||||
testCase()
|
||||
}
|
||||
|
||||
type TestVerifierCircuit struct {
|
||||
proofWithPIsFilename string `gnark:"-"`
|
||||
commonCircuitDataFilename string `gnark:"-"`
|
||||
verifierOnlyCircuitDataFilename string `gnark:"-"`
|
||||
}
|
||||
|
||||
func (c *TestVerifierCircuit) Define(api frontend.API) error {
|
||||
proofWithPis := DeserializeProofWithPublicInputs(c.proofWithPIsFilename)
|
||||
commonCircuitData := DeserializeCommonCircuitData(c.commonCircuitDataFilename)
|
||||
verfierOnlyCircuitData := DeserializeVerifierOnlyCircuitData(c.verifierOnlyCircuitDataFilename)
|
||||
|
||||
fieldAPI := NewFieldAPI(api)
|
||||
qeAPI := NewQuadraticExtensionAPI(fieldAPI, commonCircuitData.DegreeBits)
|
||||
hashAPI := NewHashAPI(fieldAPI)
|
||||
poseidonChip := NewPoseidonChip(api, fieldAPI)
|
||||
plonkChip := NewPlonkChip(api, qeAPI, commonCircuitData)
|
||||
friChip := NewFriChip(api, fieldAPI, qeAPI, hashAPI, poseidonChip, &commonCircuitData.FriParams)
|
||||
verifierChip := VerifierChip{
|
||||
api: api,
|
||||
fieldAPI: fieldAPI,
|
||||
qeAPI: qeAPI,
|
||||
poseidonChip: poseidonChip,
|
||||
plonkChip: plonkChip,
|
||||
friChip: friChip,
|
||||
}
|
||||
verifierChip.Verify(proofWithPis, verfierOnlyCircuitData, commonCircuitData)
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestDummyVerifier(t *testing.T) {
|
||||
assert := test.NewAssert(t)
|
||||
|
||||
testCase := func() {
|
||||
circuit := TestVerifierCircuit{
|
||||
proofWithPIsFilename: "./data/dummy_2^14_gates/proof_with_public_inputs.json",
|
||||
commonCircuitDataFilename: "./data/dummy_2^14_gates/common_circuit_data.json",
|
||||
verifierOnlyCircuitDataFilename: "./data/dummy_2^14_gates/verifier_only_circuit_data.json",
|
||||
}
|
||||
|
||||
witness := TestVerifierCircuit{}
|
||||
err := test.IsSolved(&circuit, &witness, TEST_CURVE.ScalarField())
|
||||
assert.NoError(err)
|
||||
}
|
||||
testCase()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user