arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
added verifier_test
Kevin Jue kjue235@gmail.com
Tue, 22 Nov 2022 16:50:43 -0800
commit

4498f175f1ea0b2c4c3f3ea1f508794eda3efc46

parent

148788ea514f41577a220512427fc651a1c8b9c5

M go.mod → go.mod

@@ -30,4 +30,4 @@ )

// For now, use a forked version of gnark so that the emaulated fields are // mod'ed when printed. See here: https://github.com/kevjue/gnark/commit/0b216679a380b4b8d29f10dd96f34e8a5702463e -replace github.com/consensys/gnark v0.7.2-0.20220921094618-a121a3074ee8 => github.com/kevjue/gnark v0.7.2-0.20221109003544-edd49e7202a7 +replace github.com/consensys/gnark v0.7.2-0.20220921094618-a121a3074ee8 => github.com/kevjue/gnark v0.7.2-0.20221123002814-bcc0d7d32d60
M go.sum → go.sum

@@ -16,8 +16,8 @@ github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=

github.com/google/pprof v0.0.0-20220729232143-a41b82acbcb1 h1:8pyqKJvrJqUYaKS851Ule26pwWvey6IDMiczaBLDKLQ= github.com/google/pprof v0.0.0-20220729232143-a41b82acbcb1/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/kevjue/gnark v0.7.2-0.20221109003544-edd49e7202a7 h1:pU9438pFjuTjtDA4iV/oOPcdnzL7KelKXp4aHuqn2o4= -github.com/kevjue/gnark v0.7.2-0.20221109003544-edd49e7202a7/go.mod h1:iN7/IRE6Eu2QKnTJEsoS48suBV0O5XrM+Nzo1ipp6Zw= +github.com/kevjue/gnark v0.7.2-0.20221123002814-bcc0d7d32d60 h1:Z7hWN0/Spz1H18rBm9qpqzy0dX1/uWhGSMxMMEaruVY= +github.com/kevjue/gnark v0.7.2-0.20221123002814-bcc0d7d32d60/go.mod h1:iN7/IRE6Eu2QKnTJEsoS48suBV0O5XrM+Nzo1ipp6Zw= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
M plonky2_verifier/plonk.go → plonky2_verifier/plonk.go

@@ -174,19 +174,12 @@ )

} 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-- {

@@ -219,8 +212,8 @@ // where the "real" quotient polynomial is `t(X) = t_0(X) + t_1(X)*X^n + t_2(X)*X^{2n} + ...`.

// 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 @@ zetaPowN,

), ) - // 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) } }
M plonky2_verifier/verifier.go → plonky2_verifier/verifier.go

@@ -82,6 +82,25 @@ proofWithPis.Proof.PlonkZsPartialProductsCap,

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(),
M plonky2_verifier/verifier_test.go → plonky2_verifier/verifier_test.go

@@ -9,7 +9,7 @@ "github.com/consensys/gnark/frontend"

"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 @@

verifierChip *VerifierChip } -func (c *TestVerifierCircuit) GetChallengesSanityCheck( +func (c *TestVerifierChallengesCircuit) GetChallengesSanityCheck( proofWithPis ProofWithPublicInputs, verifierData VerifierOnlyCircuitData, commonData CommonCircuitData,

@@ -90,7 +90,7 @@ c.fieldAPI.AssertIsEqual(c.expectedFriQueryIndices[i], proofChallenges.FriChallenges.FriQueryIndicies[i])

} } -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 @@ NewFieldElement(11748359318238148146),

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 @@ NewFieldElement(5837067135702409874),

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() +}