gnark-plonky2-verifier/benchmark.go
benchmark.goRaw
1package main
2
3import (
4 "flag"
5 "fmt"
6 "os"
7 "time"
8
9 "github.com/succinctlabs/gnark-plonky2-verifier/verifier"
10 "github.com/succinctlabs/gnark-plonky2-verifier/verifier/common"
11 "github.com/succinctlabs/gnark-plonky2-verifier/verifier/utils"
12
13 "github.com/consensys/gnark-crypto/ecc"
14 "github.com/consensys/gnark/backend/groth16"
15 "github.com/consensys/gnark/constraint"
16 "github.com/consensys/gnark/frontend"
17 "github.com/consensys/gnark/frontend/cs/r1cs"
18 "github.com/consensys/gnark/profile"
19)
20
21type BenchmarkPlonky2VerifierCircuit struct {
22 ProofWithPis common.ProofWithPublicInputs `gnark:",public"`
23
24 verifierChip *verifier.VerifierChip
25 plonky2CircuitName string
26}
27
28func (circuit *BenchmarkPlonky2VerifierCircuit) Define(api frontend.API) error {
29 circuitDirname := "./verifier/data/" + circuit.plonky2CircuitName + "/"
30 commonCircuitData := utils.DeserializeCommonCircuitData(circuitDirname + "common_circuit_data.json")
31 verifierOnlyCircuitData := utils.DeserializeVerifierOnlyCircuitData(circuitDirname + "verifier_only_circuit_data.json")
32
33 circuit.verifierChip = verifier.NewVerifierChip(api, commonCircuitData)
34
35 circuit.verifierChip.Verify(circuit.ProofWithPis, verifierOnlyCircuitData, commonCircuitData)
36
37 return nil
38}
39
40func compileCircuit(plonky2Circuit string) constraint.ConstraintSystem {
41 circuit := BenchmarkPlonky2VerifierCircuit{
42 plonky2CircuitName: plonky2Circuit,
43 }
44 proofWithPis := utils.DeserializeProofWithPublicInputs("./verifier/data/" + plonky2Circuit + "/proof_with_public_inputs.json")
45 circuit.ProofWithPis = proofWithPis
46
47 p := profile.Start()
48 r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit)
49 if err != nil {
50 fmt.Println("error in building circuit", err)
51 os.Exit(1)
52 }
53 p.Stop()
54 fmt.Println(p.NbConstraints())
55 fmt.Println(p.Top())
56
57 return r1cs
58}
59
60func createProof(r1cs constraint.ConstraintSystem, plonky2Circuit string) groth16.Proof {
61 proofWithPis := utils.DeserializeProofWithPublicInputs("./verifier/data/" + plonky2Circuit + "/proof_with_public_inputs.json")
62
63 // Witness
64 assignment := &BenchmarkPlonky2VerifierCircuit{
65 ProofWithPis: proofWithPis,
66 }
67
68 fmt.Println("Generating witness", time.Now())
69 witness, _ := frontend.NewWitness(assignment, ecc.BN254.ScalarField())
70 publicWitness, _ := witness.Public()
71
72 fmt.Println("Running circuit setup", time.Now())
73 pk, vk, err := groth16.Setup(r1cs)
74 if err != nil {
75 fmt.Println(err)
76 os.Exit(1)
77 }
78
79 fmt.Println("Creating proof", time.Now())
80 proof, err := groth16.Prove(r1cs, pk, witness)
81 if err != nil {
82 fmt.Println(err)
83 os.Exit(1)
84 }
85 fmt.Println("Verifying proof", time.Now())
86 err = groth16.Verify(proof, vk, publicWitness)
87 if err != nil {
88 fmt.Println(err)
89 os.Exit(1)
90 }
91
92 return proof
93}
94
95func main() {
96 plonky2Circuit := flag.String("plonky2-circuit", "", "plonky2 circuit to benchmark")
97 flag.Parse()
98
99 if plonky2Circuit == nil || *plonky2Circuit == "" {
100 fmt.Println("Please provide a plonky2 circuit to benchmark")
101 os.Exit(1)
102 }
103
104 r1cs := compileCircuit(*plonky2Circuit)
105 println("r1cs.GetNbCoefficients(): ", r1cs.GetNbCoefficients())
106 println("r1cs.GetNbConstraints(): ", r1cs.GetNbConstraints())
107 println("r1cs.GetNbSecretVariables(): ", r1cs.GetNbSecretVariables())
108 println("r1cs.GetNbPublicVariables(): ", r1cs.GetNbPublicVariables())
109 println("r1cs.GetNbInternalVariables(): ", r1cs.GetNbInternalVariables())
110
111 /*
112 proof := createProof(r1cs, *plonky2Circuit)
113 fmt.Println(proof.CurveID(), time.Now())
114 */
115}