diff --git a/fibonacci.go b/fibonacci.go new file mode 100644 index 0000000..5bfade3 --- /dev/null +++ b/fibonacci.go @@ -0,0 +1,94 @@ +package main + +import ( + "fmt" + . "gnark-ed25519/field" + . "gnark-ed25519/plonky2_verifier" + "gnark-ed25519/poseidon" + "os" + "time" + + "github.com/consensys/gnark-crypto/ecc" + "github.com/consensys/gnark/backend/groth16" + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/frontend/cs/r1cs" +) + +type BenchmarkPlonky2VerifierCircuit struct { + proofWithPis ProofWithPublicInputs + + verifierChip *VerifierChip +} + +func (circuit *BenchmarkPlonky2VerifierCircuit) Define(api frontend.API) error { + proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/fibonacci/proof_with_public_inputs.json") + commonCircuitData := DeserializeCommonCircuitData("./plonky2_verifier/data/fibonacci/common_circuit_data.json") + verifierOnlyCircuitData := DeserializeVerifierOnlyCircuitData("./plonky2_verifier/data/fibonacci/verifier_only_circuit_data.json") + + fieldAPI := NewFieldAPI(api) + qeAPI := NewQuadraticExtensionAPI(fieldAPI, commonCircuitData.DegreeBits) + hashAPI := NewHashAPI(fieldAPI) + poseidonChip := poseidon.NewPoseidonChip(api, fieldAPI) + friChip := NewFriChip(api, fieldAPI, qeAPI, hashAPI, poseidonChip, &commonCircuitData.FriParams) + plonkChip := NewPlonkChip(api, qeAPI, commonCircuitData) + circuit.verifierChip = NewVerifierChip(api, fieldAPI, qeAPI, poseidonChip, plonkChip, friChip) + + circuit.verifierChip.Verify(proofWithPis, verifierOnlyCircuitData, commonCircuitData) + + return nil +} + +func compileCircuit() frontend.CompiledConstraintSystem { + circuit := BenchmarkPlonky2VerifierCircuit{} + proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/fibonacci/proof_with_public_inputs.json") + circuit.proofWithPis = proofWithPis + + r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &circuit) + if err != nil { + fmt.Println("error in building circuit", err) + os.Exit(1) + } + + return r1cs +} + +func createProof(r1cs frontend.CompiledConstraintSystem) groth16.Proof { + proofWithPis := DeserializeProofWithPublicInputs("./plonky2_verifier/data/fibonacci/proof_with_public_inputs.json") + + // Witness + assignment := &BenchmarkPlonky2VerifierCircuit{ + proofWithPis: proofWithPis, + } + + fmt.Println("Generating witness", time.Now()) + witness, _ := frontend.NewWitness(assignment, ecc.BN254.ScalarField()) + publicWitness, _ := witness.Public() + + fmt.Println("Running circuit setup", time.Now()) + pk, vk, err := groth16.Setup(r1cs) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + fmt.Println("Creating proof", time.Now()) + proof, err := groth16.Prove(r1cs, pk, witness) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + fmt.Println("Verifying proof", time.Now()) + err = groth16.Verify(proof, vk, publicWitness) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + return proof +} + +func main() { + r1cs := compileCircuit() + proof := createProof(r1cs) + fmt.Println(proof.CurveID(), time.Now()) +}