arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/benchmark.go
benchmark.goRaw
  1package main
  2
  3import (
  4	"flag"
  5	"fmt"
  6	. "gnark-plonky2-verifier/field"
  7	. "gnark-plonky2-verifier/plonky2_verifier"
  8	"gnark-plonky2-verifier/poseidon"
  9	"os"
 10	"time"
 11
 12	"github.com/consensys/gnark-crypto/ecc"
 13	"github.com/consensys/gnark/backend/groth16"
 14	"github.com/consensys/gnark/frontend"
 15	"github.com/consensys/gnark/frontend/cs/r1cs"
 16)
 17
 18type BenchmarkPlonky2VerifierCircuit struct {
 19	proofWithPis ProofWithPublicInputs
 20
 21	verifierChip       *VerifierChip
 22	plonky2CircuitName string
 23}
 24
 25func (circuit *BenchmarkPlonky2VerifierCircuit) Define(api frontend.API) error {
 26	circuitDirname := "./plonky2_verifier/data/" + circuit.plonky2CircuitName + "/"
 27	proofWithPis := DeserializeProofWithPublicInputs(circuitDirname + "proof_with_public_inputs.json")
 28	commonCircuitData := DeserializeCommonCircuitData(circuitDirname + "common_circuit_data.json")
 29	verifierOnlyCircuitData := DeserializeVerifierOnlyCircuitData(circuitDirname + "verifier_only_circuit_data.json")
 30
 31	fieldAPI := NewFieldAPI(api)
 32	qeAPI := NewQuadraticExtensionAPI(fieldAPI, commonCircuitData.DegreeBits)
 33	hashAPI := NewHashAPI(fieldAPI)
 34	poseidonChip := poseidon.NewPoseidonChip(api, fieldAPI, qeAPI)
 35	friChip := NewFriChip(api, fieldAPI, qeAPI, hashAPI, poseidonChip, &commonCircuitData.FriParams)
 36	plonkChip := NewPlonkChip(api, qeAPI, commonCircuitData)
 37	circuit.verifierChip = NewVerifierChip(api, fieldAPI, qeAPI, poseidonChip, plonkChip, friChip)
 38
 39	circuit.verifierChip.Verify(proofWithPis, verifierOnlyCircuitData, commonCircuitData)
 40
 41	return nil
 42}
 43
 44func compileCircuit(plonky2Circuit string) frontend.CompiledConstraintSystem {
 45	circuit := BenchmarkPlonky2VerifierCircuit{
 46		plonky2CircuitName: plonky2Circuit,
 47	}
 48	proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/" + plonky2Circuit + "/proof_with_public_inputs.json")
 49	circuit.proofWithPis = proofWithPis
 50
 51	r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit)
 52	if err != nil {
 53		fmt.Println("error in building circuit", err)
 54		os.Exit(1)
 55	}
 56
 57	return r1cs
 58}
 59
 60func createProof(r1cs frontend.CompiledConstraintSystem, plonky2Circuit string) groth16.Proof {
 61	proofWithPis := DeserializeProofWithPublicInputs("./plonky2_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	proof := createProof(r1cs, *plonky2Circuit)
106	fmt.Println(proof.CurveID(), time.Now())
107}