arnaucube
arnaucube/go-circom-prover-verifierPublic Self-hosted repository
go-circom-prover-verifier/prover/prover_test.go
prover/prover_test.goRaw
 1package prover
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"io/ioutil"
 7	"os"
 8	"testing"
 9	"time"
10
11	"github.com/iden3/go-circom-prover-verifier/parsers"
12	"github.com/iden3/go-circom-prover-verifier/verifier"
13	"github.com/stretchr/testify/assert"
14	"github.com/stretchr/testify/require"
15)
16
17func TestCircuitsGenerateProof(t *testing.T) {
18	testCircuitGenerateProof(t, "circuit1k") // 1000 constraints
19	testCircuitGenerateProof(t, "circuit5k") // 5000 constraints
20	// testCircuitGenerateProof(t, "circuit10k") // 10000 constraints
21	// testCircuitGenerateProof(t, "circuit20k") // 20000 constraints
22}
23
24func testCircuitGenerateProof(t *testing.T, circuit string) {
25	// using json provingKey file
26	// provingKeyJson, err := ioutil.ReadFile("../testdata/" + circuit + "/proving_key.json")
27	// require.Nil(t, err)
28	// pk, err := parsers.ParsePk(provingKeyJson)
29	// require.Nil(t, err)
30	// witnessJson, err := ioutil.ReadFile("../testdata/" + circuit + "/witness.json")
31	// require.Nil(t, err)
32	// w, err := parsers.ParseWitness(witnessJson)
33	// require.Nil(t, err)
34
35	// using bin provingKey file
36	pkBinFile, err := os.Open("../testdata/" + circuit + "/proving_key.bin")
37	require.Nil(t, err)
38	defer pkBinFile.Close()
39	pk, err := parsers.ParsePkBin(pkBinFile)
40	require.Nil(t, err)
41
42	witnessBinFile, err := os.Open("../testdata/" + circuit + "/witness.bin")
43	require.Nil(t, err)
44	defer witnessBinFile.Close()
45	w, err := parsers.ParseWitnessBin(witnessBinFile)
46	require.Nil(t, err)
47
48	beforeT := time.Now()
49	proof, pubSignals, err := GenerateProof(pk, w)
50	assert.Nil(t, err)
51	fmt.Println("proof generation time for "+circuit+" elapsed:", time.Since(beforeT))
52
53	proofStr, err := parsers.ProofToJson(proof)
54	assert.Nil(t, err)
55
56	err = ioutil.WriteFile("../testdata/"+circuit+"/proof.json", proofStr, 0644)
57	assert.Nil(t, err)
58	publicStr, err := json.Marshal(parsers.ArrayBigIntToString(pubSignals))
59	assert.Nil(t, err)
60	err = ioutil.WriteFile("../testdata/"+circuit+"/public.json", publicStr, 0644)
61	assert.Nil(t, err)
62
63	// verify the proof
64	vkJson, err := ioutil.ReadFile("../testdata/" + circuit + "/verification_key.json")
65	require.Nil(t, err)
66	vk, err := parsers.ParseVk(vkJson)
67	require.Nil(t, err)
68
69	v := verifier.Verify(vk, proof, pubSignals)
70	assert.True(t, v)
71
72	// to verify the proof with snarkjs:
73	// snarkjs verify --vk testdata/circuitX/verification_key.json -p testdata/circuitX/proof.json --pub testdata/circuitX/public.json
74}
75
76func BenchmarkGenerateProof(b *testing.B) {
77	// benchmark with a circuit of 10000 constraints
78	provingKeyJson, err := ioutil.ReadFile("../testdata/circuit5k/proving_key.json")
79	require.Nil(b, err)
80	pk, err := parsers.ParsePk(provingKeyJson)
81	require.Nil(b, err)
82
83	witnessJson, err := ioutil.ReadFile("../testdata/circuit5k/witness.json")
84	require.Nil(b, err)
85	w, err := parsers.ParseWitness(witnessJson)
86	require.Nil(b, err)
87
88	for i := 0; i < b.N; i++ {
89		GenerateProof(pk, w)
90	}
91}