From 4262ff15fe501727860ad15c68d1c48810f7626b Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Fri, 28 Oct 2022 15:29:25 -0700 Subject: [PATCH] added plonk test file --- plonky2_verifier/plonk.go | 33 ++++++++++-------- plonky2_verifier/plonk_test.go | 64 ++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 15 deletions(-) create mode 100644 plonky2_verifier/plonk_test.go diff --git a/plonky2_verifier/plonk.go b/plonky2_verifier/plonk.go index 782ee7d..34e4083 100644 --- a/plonky2_verifier/plonk.go +++ b/plonky2_verifier/plonk.go @@ -40,23 +40,26 @@ func (p *PlonkChip) evalL0(x QuadraticExtension, xPowN QuadraticExtension) Quadr ) } -func (p *PlonkChip) checkPartialProductsCircuit( +func (p *PlonkChip) checkPartialProducts( numerators []QuadraticExtension, denominators []QuadraticExtension, challengeNum uint64) []QuadraticExtension { - productAccs := make([]QuadraticExtension, p.commonData.NumPartialProducts+2) + numPartProds := p.commonData.NumPartialProducts + quotDegreeFactor := p.commonData.QuotientDegreeFactor + + productAccs := make([]QuadraticExtension, numPartProds+2) productAccs = append(productAccs, p.openings.PlonkZs[challengeNum]) - productAccs = append(productAccs, p.openings.PartialProducts[challengeNum*p.commonData.NumPartialProducts:(challengeNum+1)*p.commonData.NumPartialProducts]...) + productAccs = append(productAccs, p.openings.PartialProducts[challengeNum*numPartProds:(challengeNum+1)*numPartProds]...) productAccs = append(productAccs, p.openings.PlonkZsNext[challengeNum]) - partialProductChecks := make([]QuadraticExtension, p) + partialProductChecks := make([]QuadraticExtension, numPartProds) - for i := uint64(0); i < numPartialProducts; i += 1 { - ppStartIdx := i * p.commonData.QuotientDegreeFactor + for i := uint64(0); i < numPartProds; i += 1 { + ppStartIdx := i * quotDegreeFactor numeProduct := numerators[ppStartIdx] denoProduct := denominators[ppStartIdx] - for j := uint64(1); j < p.commonData.QuotientDegreeFactor; j++ { + for j := uint64(1); j < quotDegreeFactor; j++ { numeProduct = p.qe.MulExtension(numeProduct, numerators[ppStartIdx+j]) denoProduct = p.qe.MulExtension(denoProduct, denominators[ppStartIdx+j]) } @@ -87,6 +90,7 @@ func (p *PlonkChip) evalVanishingPoly() []QuadraticExtension { l_0_zeta := p.evalL0(p.proofChallenges.PlonkZeta, zeta_pow_n) vanishing_z1_terms := make([]QuadraticExtension, p.commonData.Config.NumChallenges) + vanishing_partial_products_terms := make([]QuadraticExtension, p.commonData.Config.NumChallenges*p.commonData.NumPartialProducts) numerator_values := make([]QuadraticExtension, p.commonData.Config.NumChallenges*p.commonData.Config.NumRoutedWires) denominator_values := make([]QuadraticExtension, p.commonData.Config.NumChallenges*p.commonData.Config.NumRoutedWires) for i := uint64(0); i < p.commonData.Config.NumChallenges; i++ { @@ -120,17 +124,16 @@ func (p *PlonkChip) evalVanishingPoly() []QuadraticExtension { numerator_values = append(numerator_values, numerator) denominator_values = append(denominator_values, denominator) } + + vanishing_partial_products_terms = append( + vanishing_partial_products_terms, + p.checkPartialProducts(numerator_values, denominator_values, i)..., + ) } + return vanishing_partial_products_terms } func (p *PlonkChip) Verify() { - zeta_pow_deg := p.expPowerOf2Extension(p.proofChallenges.PlonkZeta) - p.evalVanishingPoly(p.proofChallenges.PlonkZeta, zeta_pow_deg) - - vanishingZTerms := make(F, commonData.Config.NumChallenges) - - for i := 0; i < int(commonData.Config.NumChallenges); i++ { - - } + p.evalVanishingPoly() } diff --git a/plonky2_verifier/plonk_test.go b/plonky2_verifier/plonk_test.go new file mode 100644 index 0000000..fc39614 --- /dev/null +++ b/plonky2_verifier/plonk_test.go @@ -0,0 +1,64 @@ +package plonky2_verifier + +import ( + . "gnark-ed25519/field" + "testing" + + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/test" +) + +type TestPlonkCircuit struct{} + +func (circuit *TestPlonkCircuit) Define(api frontend.API) error { + proofWithPis := DeserializeProofWithPublicInputs("./data/fibonacci/proof_with_public_inputs.json") + commonCircuitData := DeserializeCommonCircuitData("./data/fibonacci/common_circuit_data.json") + + field := NewFieldAPI(api) + qe := NewQuadraticExtensionAPI(field, commonCircuitData.DegreeBits) + + // Challenge associated with the data from "/.data/fibonacci/*" + proofChallenges := ProofChallenges{ + PlonkBetas: []F{ + NewFieldElementFromString("4678728155650926271"), + NewFieldElementFromString("13611962404289024887"), + }, + PlonkGammas: []F{ + NewFieldElementFromString("13237663823305715949"), + NewFieldElementFromString("15389314098328235145"), + }, + PlonkAlphas: []F{ + NewFieldElementFromString("14505919539124304197"), + NewFieldElementFromString("1695455639263736117"), + }, + PlonkZeta: QuadraticExtension{ + NewFieldElementFromString("14887793628029982930"), + NewFieldElementFromString("1136137158284059037"), + }, + } + + plonkChip := PlonkChip{ + api: api, + field: field, + qe: qe, + commonData: commonCircuitData, + proofChallenges: proofChallenges, + openings: proofWithPis.Proof.Openings, + } + + plonkChip.Verify() + return nil +} + +func TestPlonkWitness(t *testing.T) { + assert := test.NewAssert(t) + + testCase := func() { + circuit := TestPlonkCircuit{} + witness := TestPlonkCircuit{} + err := test.IsSolved(&circuit, &witness, TEST_CURVE.ScalarField()) + assert.NoError(err) + } + + testCase() +}