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/frontend"
16 "github.com/consensys/gnark/frontend/cs/r1cs"
17)
18
19type BenchmarkPlonky2VerifierCircuit struct {
20 proofWithPis common.ProofWithPublicInputs
21
22 verifierChip *verifier.VerifierChip
23 plonky2CircuitName string
24}
25
26func (circuit *BenchmarkPlonky2VerifierCircuit) Define(api frontend.API) error {
27 circuitDirname := "./verifier/data/" + circuit.plonky2CircuitName + "/"
28 proofWithPis := utils.DeserializeProofWithPublicInputs(circuitDirname + "proof_with_public_inputs.json")
29 commonCircuitData := utils.DeserializeCommonCircuitData(circuitDirname + "common_circuit_data.json")
30 verifierOnlyCircuitData := utils.DeserializeVerifierOnlyCircuitData(circuitDirname + "verifier_only_circuit_data.json")
31
32 circuit.verifierChip = verifier.NewVerifierChip(api, commonCircuitData)
33
34 circuit.verifierChip.Verify(proofWithPis, verifierOnlyCircuitData, commonCircuitData)
35
36 return nil
37}
38
39func compileCircuit(plonky2Circuit string) frontend.CompiledConstraintSystem {
40 circuit := BenchmarkPlonky2VerifierCircuit{
41 plonky2CircuitName: plonky2Circuit,
42 }
43 proofWithPis := utils.DeserializeProofWithPublicInputs("./verifier/data/" + plonky2Circuit + "/proof_with_public_inputs.json")
44 circuit.proofWithPis = proofWithPis
45
46 r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit)
47 if err != nil {
48 fmt.Println("error in building circuit", err)
49 os.Exit(1)
50 }
51
52 return r1cs
53}
54
55func createProof(r1cs frontend.CompiledConstraintSystem, plonky2Circuit string) groth16.Proof {
56 proofWithPis := utils.DeserializeProofWithPublicInputs("./verifier/data/" + plonky2Circuit + "/proof_with_public_inputs.json")
57
58 // Witness
59 assignment := &BenchmarkPlonky2VerifierCircuit{
60 proofWithPis: proofWithPis,
61 }
62
63 fmt.Println("Generating witness", time.Now())
64 witness, _ := frontend.NewWitness(assignment, ecc.BN254.ScalarField())
65 publicWitness, _ := witness.Public()
66
67 fmt.Println("Running circuit setup", time.Now())
68 pk, vk, err := groth16.Setup(r1cs)
69 if err != nil {
70 fmt.Println(err)
71 os.Exit(1)
72 }
73
74 fmt.Println("Creating proof", time.Now())
75 proof, err := groth16.Prove(r1cs, pk, witness)
76 if err != nil {
77 fmt.Println(err)
78 os.Exit(1)
79 }
80 fmt.Println("Verifying proof", time.Now())
81 err = groth16.Verify(proof, vk, publicWitness)
82 if err != nil {
83 fmt.Println(err)
84 os.Exit(1)
85 }
86
87 return proof
88}
89
90func main() {
91 plonky2Circuit := flag.String("plonky2-circuit", "", "plonky2 circuit to benchmark")
92 flag.Parse()
93
94 if plonky2Circuit == nil || *plonky2Circuit == "" {
95 fmt.Println("Please provide a plonky2 circuit to benchmark")
96 os.Exit(1)
97 }
98
99 r1cs := compileCircuit(*plonky2Circuit)
100 proof := createProof(r1cs, *plonky2Circuit)
101 fmt.Println(proof.CurveID(), time.Now())
102}