arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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}