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/circuit1/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/circuit1/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}