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	"testing"
 8	"time"
 9
10	"github.com/iden3/go-circom-prover-verifier/parsers"
11	"github.com/iden3/go-circom-prover-verifier/verifier"
12	"github.com/stretchr/testify/assert"
13	"github.com/stretchr/testify/require"
14)
15
16func TestCircuitsGenerateProof(t *testing.T) {
17	testCircuitGenerateProof(t, "circuit1k") // 1000 constraints
18	testCircuitGenerateProof(t, "circuit5k") // 5000 constraints
19        //testCircuitGenerateProof(t, "circuit10k") // 10000 constraints
20        //testCircuitGenerateProof(t, "circuit20k") // 20000 constraints
21}
22
23func testCircuitGenerateProof(t *testing.T, circuit string) {
24	provingKeyJson, err := ioutil.ReadFile("../testdata/" + circuit + "/proving_key.json")
25	require.Nil(t, err)
26	pk, err := parsers.ParsePk(provingKeyJson)
27	require.Nil(t, err)
28
29	witnessJson, err := ioutil.ReadFile("../testdata/" + circuit + "/witness.json")
30	require.Nil(t, err)
31	w, err := parsers.ParseWitness(witnessJson)
32	require.Nil(t, err)
33
34	beforeT := time.Now()
35	proof, pubSignals, err := GenerateProof(pk, w)
36	assert.Nil(t, err)
37	fmt.Println("proof generation time elapsed:", time.Since(beforeT))
38
39	proofStr, err := parsers.ProofToJson(proof)
40	assert.Nil(t, err)
41
42	err = ioutil.WriteFile("../testdata/"+circuit+"/proof.json", proofStr, 0644)
43	assert.Nil(t, err)
44	publicStr, err := json.Marshal(parsers.ArrayBigIntToString(pubSignals))
45	assert.Nil(t, err)
46	err = ioutil.WriteFile("../testdata/"+circuit+"/public.json", publicStr, 0644)
47	assert.Nil(t, err)
48
49	// verify the proof
50	vkJson, err := ioutil.ReadFile("../testdata/" + circuit + "/verification_key.json")
51	require.Nil(t, err)
52	vk, err := parsers.ParseVk(vkJson)
53	require.Nil(t, err)
54
55	v := verifier.Verify(vk, proof, pubSignals)
56	assert.True(t, v)
57
58	// to verify the proof with snarkjs:
59	// snarkjs verify --vk testdata/circuitX/verification_key.json -p testdata/circuitX/proof.json --pub testdata/circuitX/public.json
60}
61
62func BenchmarkGenerateProof(b *testing.B) {
63	// benchmark with a circuit of 10000 constraints
64	provingKeyJson, err := ioutil.ReadFile("../testdata/circuit5k/proving_key.json")
65	require.Nil(b, err)
66	pk, err := parsers.ParsePk(provingKeyJson)
67	require.Nil(b, err)
68
69	witnessJson, err := ioutil.ReadFile("../testdata/circuit5k/witness.json")
70	require.Nil(b, err)
71	w, err := parsers.ParseWitness(witnessJson)
72	require.Nil(b, err)
73
74	for i := 0; i < b.N; i++ {
75		GenerateProof(pk, w)
76	}
77}