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/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}