From ecfc4a7b2b2763496bdd78eb8e620e666fbb5958 Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Wed, 7 Jun 2023 11:33:18 -0700 Subject: [PATCH] added serialization support for benchmark.go --- benchmark.go | 76 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/benchmark.go b/benchmark.go index 37070d6..b48d3be 100644 --- a/benchmark.go +++ b/benchmark.go @@ -12,7 +12,6 @@ import ( "github.com/consensys/gnark-crypto/ecc" "github.com/consensys/gnark/backend/groth16" - "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/frontend/cs/r1cs" "github.com/consensys/gnark/profile" @@ -37,27 +36,54 @@ func (circuit *BenchmarkPlonky2VerifierCircuit) Define(api frontend.API) error { return nil } -func compileCircuit(plonky2Circuit string) constraint.ConstraintSystem { +func compileCircuit(plonky2Circuit string, doProfiling bool) { circuit := BenchmarkPlonky2VerifierCircuit{ plonky2CircuitName: plonky2Circuit, } proofWithPis := utils.DeserializeProofWithPublicInputs("./verifier/data/" + plonky2Circuit + "/proof_with_public_inputs.json") circuit.ProofWithPis = proofWithPis - p := profile.Start() + var p *profile.Profile + if doProfiling { + p = profile.Start() + } r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit) if err != nil { fmt.Println("error in building circuit", err) os.Exit(1) } - p.Stop() - fmt.Println(p.NbConstraints()) - fmt.Println(p.Top()) - return r1cs + if doProfiling { + p.Stop() + p.Top() + println("r1cs.GetNbCoefficients(): ", r1cs.GetNbCoefficients()) + println("r1cs.GetNbConstraints(): ", r1cs.GetNbConstraints()) + println("r1cs.GetNbSecretVariables(): ", r1cs.GetNbSecretVariables()) + println("r1cs.GetNbPublicVariables(): ", r1cs.GetNbPublicVariables()) + println("r1cs.GetNbInternalVariables(): ", r1cs.GetNbInternalVariables()) + } + + fR1CS, _ := os.Create("circuit") + r1cs.WriteTo(fR1CS) + fR1CS.Close() + + fmt.Println("Running circuit setup", time.Now()) + pk, vk, err := groth16.Setup(r1cs) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + fPK, _ := os.Create("proving.key") + pk.WriteTo(fPK) + fPK.Close() + + fVK, _ := os.Create("verifying.key") + vk.WriteTo(fVK) + fVK.Close() } -func createProof(r1cs constraint.ConstraintSystem, plonky2Circuit string) groth16.Proof { +func createProof(plonky2Circuit string) groth16.Proof { proofWithPis := utils.DeserializeProofWithPublicInputs("./verifier/data/" + plonky2Circuit + "/proof_with_public_inputs.json") // Witness @@ -69,12 +95,20 @@ func createProof(r1cs constraint.ConstraintSystem, plonky2Circuit string) groth1 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) - } + r1cs := groth16.NewCS(ecc.BN254) + fR1CS, _ := os.Open("circuit") + r1cs.ReadFrom(fR1CS) + fR1CS.Close() + + var pk groth16.ProvingKey + fPK, _ := os.Open("proving.key") + pk.ReadFrom(fPK) + fPK.Close() + + var vk groth16.VerifyingKey + fVK, _ := os.Open("verifying.key") + vk.ReadFrom(fVK) + fVK.Close() fmt.Println("Creating proof", time.Now()) proof, err := groth16.Prove(r1cs, pk, witness) @@ -94,6 +128,7 @@ func createProof(r1cs constraint.ConstraintSystem, plonky2Circuit string) groth1 func main() { plonky2Circuit := flag.String("plonky2-circuit", "", "plonky2 circuit to benchmark") + doProfile := flag.Bool("profile", false, "profile the circuit") flag.Parse() if plonky2Circuit == nil || *plonky2Circuit == "" { @@ -101,15 +136,6 @@ func main() { os.Exit(1) } - r1cs := compileCircuit(*plonky2Circuit) - println("r1cs.GetNbCoefficients(): ", r1cs.GetNbCoefficients()) - println("r1cs.GetNbConstraints(): ", r1cs.GetNbConstraints()) - println("r1cs.GetNbSecretVariables(): ", r1cs.GetNbSecretVariables()) - println("r1cs.GetNbPublicVariables(): ", r1cs.GetNbPublicVariables()) - println("r1cs.GetNbInternalVariables(): ", r1cs.GetNbInternalVariables()) - - /* - proof := createProof(r1cs, *plonky2Circuit) - fmt.Println(proof.CurveID(), time.Now()) - */ + compileCircuit(*plonky2Circuit, *doProfile) + createProof(*plonky2Circuit) }