From 8fe0c7f6b6ee1d393c04652265e5be2743f720d2 Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Tue, 22 Nov 2022 17:57:26 -0800 Subject: [PATCH] added plonky2_verifier_benchmark --- plonky2_verifier/challenger.go | 9 +++- plonky2_verifier/fri.go | 12 ++--- plonky2_verifier/plonk.go | 12 ++--- plonky2_verifier/verifier.go | 6 +-- plonky2_verifier_benchmark.go | 94 ++++++++++++++++++++++++++++++++++ poseidon/poseidon.go | 4 +- 6 files changed, 118 insertions(+), 19 deletions(-) create mode 100644 plonky2_verifier_benchmark.go diff --git a/plonky2_verifier/challenger.go b/plonky2_verifier/challenger.go index 8ec47dd..931db60 100644 --- a/plonky2_verifier/challenger.go +++ b/plonky2_verifier/challenger.go @@ -9,8 +9,8 @@ import ( ) type ChallengerChip struct { - api frontend.API - field frontend.API + api frontend.API `gnark:"-"` + field frontend.API `gnark:"-"` poseidonChip *poseidon.PoseidonChip spongeState [poseidon.SPONGE_WIDTH]F inputBuffer []F @@ -21,6 +21,11 @@ func NewChallengerChip(api frontend.API, field frontend.API, poseidonChip *posei var spongeState [poseidon.SPONGE_WIDTH]F var inputBuffer []F var outputBuffer []F + + for i := 0; i < poseidon.SPONGE_WIDTH; i++ { + spongeState[i] = ZERO_F + } + return &ChallengerChip{ api: api, field: field, diff --git a/plonky2_verifier/fri.go b/plonky2_verifier/fri.go index f054104..0108d15 100644 --- a/plonky2_verifier/fri.go +++ b/plonky2_verifier/fri.go @@ -14,15 +14,15 @@ import ( ) type FriChip struct { - api frontend.API - fieldAPI frontend.API - qeAPI *QuadraticExtensionAPI - hashAPI *HashAPI + api frontend.API `gnark:"-"` + fieldAPI frontend.API `gnark:"-"` + qeAPI *QuadraticExtensionAPI `gnark:"-"` + hashAPI *HashAPI `gnark:"-"` poseidonChip *poseidon.PoseidonChip - friParams *FriParams - verifierOnlyCircuitData *VerifierOnlyCircuitData + friParams *FriParams `gnark:"-"` + verifierOnlyCircuitData *VerifierOnlyCircuitData `gnark:"-"` } func NewFriChip( diff --git a/plonky2_verifier/plonk.go b/plonky2_verifier/plonk.go index 8004770..acf8e81 100644 --- a/plonky2_verifier/plonk.go +++ b/plonky2_verifier/plonk.go @@ -32,14 +32,14 @@ var QUOTIENT = PlonkOracle{ } type PlonkChip struct { - api frontend.API - qeAPI *QuadraticExtensionAPI + api frontend.API `gnark:"-"` + qeAPI *QuadraticExtensionAPI `gnark:"-"` - commonData CommonCircuitData + commonData CommonCircuitData `gnark:"-"` - DEGREE F - DEGREE_BITS_F F - DEGREE_QE QuadraticExtension + DEGREE F `gnark:"-"` + DEGREE_BITS_F F `gnark:"-"` + DEGREE_QE QuadraticExtension `gnark:"-"` } func NewPlonkChip(api frontend.API, qeAPI *QuadraticExtensionAPI, commonData CommonCircuitData) *PlonkChip { diff --git a/plonky2_verifier/verifier.go b/plonky2_verifier/verifier.go index 821d348..5a76990 100644 --- a/plonky2_verifier/verifier.go +++ b/plonky2_verifier/verifier.go @@ -8,9 +8,9 @@ import ( ) type VerifierChip struct { - api frontend.API - fieldAPI frontend.API - qeAPI *QuadraticExtensionAPI + api frontend.API `gnark:"-"` + fieldAPI frontend.API `gnark:"-"` + qeAPI *QuadraticExtensionAPI `gnark:"-"` poseidonChip *poseidon.PoseidonChip plonkChip *PlonkChip friChip *FriChip diff --git a/plonky2_verifier_benchmark.go b/plonky2_verifier_benchmark.go new file mode 100644 index 0000000..d7d8a13 --- /dev/null +++ b/plonky2_verifier_benchmark.go @@ -0,0 +1,94 @@ +package main + +import ( + "fmt" + . "gnark-ed25519/field" + . "gnark-ed25519/plonky2_verifier" + "gnark-ed25519/poseidon" + "os" + "time" + + "github.com/consensys/gnark-crypto/ecc" + "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/frontend/cs/r1cs" +) + +type BenchmarkPlonky2VerifierCircuit struct { + proofWithPis ProofWithPublicInputs + + verifierChip *VerifierChip +} + +func (circuit *BenchmarkPlonky2VerifierCircuit) Define(api frontend.API) error { + proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/dummy_2^14_gates/proof_with_public_inputs.json") + commonCircuitData := DeserializeCommonCircuitData("./plonky2_verifier/data/dummy_2^14_gates/common_circuit_data.json") + verifierOnlyCircuitData := DeserializeVerifierOnlyCircuitData("./plonky2_verifier/data/dummy_2^14_gates/verifier_only_circuit_data.json") + + fieldAPI := NewFieldAPI(api) + qeAPI := NewQuadraticExtensionAPI(fieldAPI, commonCircuitData.DegreeBits) + hashAPI := NewHashAPI(fieldAPI) + poseidonChip := poseidon.NewPoseidonChip(api, fieldAPI) + friChip := NewFriChip(api, fieldAPI, qeAPI, hashAPI, poseidonChip, &commonCircuitData.FriParams) + plonkChip := NewPlonkChip(api, qeAPI, commonCircuitData) + circuit.verifierChip = NewVerifierChip(api, fieldAPI, qeAPI, poseidonChip, plonkChip, friChip) + + circuit.verifierChip.Verify(proofWithPis, verifierOnlyCircuitData, commonCircuitData) + + return nil +} + +func compileCircuit() frontend.CompiledConstraintSystem { + circuit := BenchmarkPlonky2VerifierCircuit{} + proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/dummy_2^14_gates/proof_with_public_inputs.json") + circuit.proofWithPis = proofWithPis + + r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit) + if err != nil { + fmt.Println("error in building circuit", err) + os.Exit(1) + } + + return r1cs +} + +func createProof(r1cs frontend.CompiledConstraintSystem) groth16.Proof { + proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/dummy_2^14_gates/proof_with_public_inputs.json") + + // Witness + assignment := &BenchmarkPlonky2VerifierCircuit{ + proofWithPis: proofWithPis, + } + + fmt.Println("Generating witness", time.Now()) + witness, _ := frontend.NewWitness(assignment, ecc.BN254.ScalarField()) + publicWitness, _ := witness.Public() + + fmt.Println("Running circuit setup", time.Now()) + pk, vk, err := groth16.Setup(r1cs) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + fmt.Println("Creating proof", time.Now()) + proof, err := groth16.Prove(r1cs, pk, witness) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + fmt.Println("Verifying proof", time.Now()) + err = groth16.Verify(proof, vk, publicWitness) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + return proof +} + +func main() { + r1cs := compileCircuit() + proof := createProof(r1cs) + fmt.Println(proof.CurveID(), time.Now()) +} diff --git a/poseidon/poseidon.go b/poseidon/poseidon.go index 330b894..8b9776e 100644 --- a/poseidon/poseidon.go +++ b/poseidon/poseidon.go @@ -17,8 +17,8 @@ const SPONGE_RATE = 8 type PoseidonState = [WIDTH]F type PoseidonChip struct { - api frontend.API - field frontend.API + api frontend.API `gnark:"-"` + field frontend.API `gnark:"-"` } func NewPoseidonChip(api frontend.API, field frontend.API) *PoseidonChip {