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	// Using go bin provingKey file:
43	pkGoBinFile, err := os.Open("../testdata/" + circuit + "/proving_key.go.bin")
44	require.Nil(t, err)
45	defer pkGoBinFile.Close()
46	pk, err := parsers.ParsePkGoBin(pkGoBinFile)
47	require.Nil(t, err)
48
49	witnessBinFile, err := os.Open("../testdata/" + circuit + "/witness.bin")
50	require.Nil(t, err)
51	defer witnessBinFile.Close()
52	w, err := parsers.ParseWitnessBin(witnessBinFile)
53	require.Nil(t, err)
54
55	beforeT := time.Now()
56	proof, pubSignals, err := GenerateProof(pk, w)
57	assert.Nil(t, err)
58	fmt.Println("proof generation time for "+circuit+" elapsed:", time.Since(beforeT))
59
60	proofStr, err := parsers.ProofToJson(proof)
61	assert.Nil(t, err)
62
63	err = ioutil.WriteFile("../testdata/"+circuit+"/proof.json", proofStr, 0644)
64	assert.Nil(t, err)
65	publicStr, err := json.Marshal(parsers.ArrayBigIntToString(pubSignals))
66	assert.Nil(t, err)
67	err = ioutil.WriteFile("../testdata/"+circuit+"/public.json", publicStr, 0644)
68	assert.Nil(t, err)
69
70	// verify the proof
71	vkJson, err := ioutil.ReadFile("../testdata/" + circuit + "/verification_key.json")
72	require.Nil(t, err)
73	vk, err := parsers.ParseVk(vkJson)
74	require.Nil(t, err)
75
76	v := verifier.Verify(vk, proof, pubSignals)
77	assert.True(t, v)
78
79	// to verify the proof with snarkjs:
80	// snarkjs verify --vk testdata/circuitX/verification_key.json -p testdata/circuitX/proof.json --pub testdata/circuitX/public.json
81}
82
83func BenchmarkGenerateProof(b *testing.B) {
84	// benchmark with a circuit of 10000 constraints
85	provingKeyJson, err := ioutil.ReadFile("../testdata/circuit5k/proving_key.json")
86	require.Nil(b, err)
87	pk, err := parsers.ParsePk(provingKeyJson)
88	require.Nil(b, err)
89
90	witnessJson, err := ioutil.ReadFile("../testdata/circuit5k/witness.json")
91	require.Nil(b, err)
92	w, err := parsers.ParseWitness(witnessJson)
93	require.Nil(b, err)
94
95	for i := 0; i < b.N; i++ {
96		GenerateProof(pk, w)
97	}
98}