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 "math/big"
8 "testing"
9 "time"
10
11 "github.com/iden3/go-circom-prover-verifier/parsers"
12 "github.com/iden3/go-circom-prover-verifier/types"
13 "github.com/iden3/go-circom-prover-verifier/verifier"
14 "github.com/stretchr/testify/assert"
15 "github.com/stretchr/testify/require"
16)
17
18func TestSmallCircuitGenerateProof(t *testing.T) {
19 provingKeyJson, err := ioutil.ReadFile("../testdata/small/proving_key.json")
20 require.Nil(t, err)
21 pk, err := parsers.ParsePk(provingKeyJson)
22 require.Nil(t, err)
23
24 witnessJson, err := ioutil.ReadFile("../testdata/small/witness.json")
25 require.Nil(t, err)
26 w, err := parsers.ParseWitness(witnessJson)
27 require.Nil(t, err)
28
29 assert.Equal(t, types.Witness{big.NewInt(1), big.NewInt(33), big.NewInt(3), big.NewInt(11)}, w)
30
31 beforeT := time.Now()
32 proof, pubSignals, err := GenerateProof(pk, w)
33 assert.Nil(t, err)
34 fmt.Println("proof generation time elapsed:", time.Since(beforeT))
35
36 proofStr, err := parsers.ProofToJson(proof)
37 assert.Nil(t, err)
38
39 err = ioutil.WriteFile("../testdata/small/proof.json", proofStr, 0644)
40 assert.Nil(t, err)
41 publicStr, err := json.Marshal(parsers.ArrayBigIntToString(pubSignals))
42 assert.Nil(t, err)
43 err = ioutil.WriteFile("../testdata/small/public.json", publicStr, 0644)
44 assert.Nil(t, err)
45
46 // verify the proof
47 vkJson, err := ioutil.ReadFile("../testdata/small/verification_key.json")
48 require.Nil(t, err)
49 vk, err := parsers.ParseVk(vkJson)
50 require.Nil(t, err)
51
52 v := verifier.Verify(vk, proof, pubSignals)
53 assert.True(t, v)
54
55 // to verify the proof with snarkjs:
56 // snarkjs verify --vk testdata/small/verification_key.json -p testdata/small/proof.json --pub testdata/small/public.json
57}
58
59func TestBigCircuitGenerateProof(t *testing.T) {
60 provingKeyJson, err := ioutil.ReadFile("../testdata/big/proving_key.json")
61 require.Nil(t, err)
62 pk, err := parsers.ParsePk(provingKeyJson)
63 require.Nil(t, err)
64
65 witnessJson, err := ioutil.ReadFile("../testdata/big/witness.json")
66 require.Nil(t, err)
67 w, err := parsers.ParseWitness(witnessJson)
68 require.Nil(t, err)
69
70 beforeT := time.Now()
71 proof, pubSignals, err := GenerateProof(pk, w)
72 assert.Nil(t, err)
73 fmt.Println("proof generation time elapsed:", time.Since(beforeT))
74
75 proofStr, err := parsers.ProofToJson(proof)
76 assert.Nil(t, err)
77
78 err = ioutil.WriteFile("../testdata/big/proof.json", proofStr, 0644)
79 assert.Nil(t, err)
80 publicStr, err := json.Marshal(parsers.ArrayBigIntToString(pubSignals))
81 assert.Nil(t, err)
82 err = ioutil.WriteFile("../testdata/big/public.json", publicStr, 0644)
83 assert.Nil(t, err)
84
85 // verify the proof
86 vkJson, err := ioutil.ReadFile("../testdata/big/verification_key.json")
87 require.Nil(t, err)
88 vk, err := parsers.ParseVk(vkJson)
89 require.Nil(t, err)
90
91 v := verifier.Verify(vk, proof, pubSignals)
92 assert.True(t, v)
93
94 // to verify the proof with snarkjs:
95 // snarkjs verify --vk testdata/big/verification_key.json -p testdata/big/proof.json --pub testdata/big/public.json
96}
97
98func TestIdStateCircuitGenerateProof(t *testing.T) {
99 // this test is to execute the proof generation for a bigger circuit
100 // (arround 22500 constraints)
101 //
102 // to see the time needed to execute this
103 // test Will need the ../testdata/idstate-circuit compiled &
104 // trustedsetup files (generated in
105 // https://github.com/iden3/go-zksnark-full-flow-example)
106 if false {
107 fmt.Println("\nTestIdStateCircuitGenerateProof activated")
108 provingKeyJson, err := ioutil.ReadFile("../testdata/idstate-circuit/proving_key.json")
109 require.Nil(t, err)
110 pk, err := parsers.ParsePk(provingKeyJson)
111 require.Nil(t, err)
112
113 witnessJson, err := ioutil.ReadFile("../testdata/idstate-circuit/witness.json")
114 require.Nil(t, err)
115 w, err := parsers.ParseWitness(witnessJson)
116 require.Nil(t, err)
117
118 beforeT := time.Now()
119 proof, pubSignals, err := GenerateProof(pk, w)
120 assert.Nil(t, err)
121 fmt.Println("proof generation time elapsed:", time.Since(beforeT))
122
123 proofStr, err := parsers.ProofToJson(proof)
124 assert.Nil(t, err)
125
126 err = ioutil.WriteFile("../testdata/idstate-circuit/proof.json", proofStr, 0644)
127 assert.Nil(t, err)
128 publicStr, err := json.Marshal(parsers.ArrayBigIntToString(pubSignals))
129 assert.Nil(t, err)
130 err = ioutil.WriteFile("../testdata/idstate-circuit/public.json", publicStr, 0644)
131 assert.Nil(t, err)
132
133 // verify the proof
134 vkJson, err := ioutil.ReadFile("../testdata/idstate-circuit/verification_key.json")
135 require.Nil(t, err)
136 vk, err := parsers.ParseVk(vkJson)
137 require.Nil(t, err)
138
139 v := verifier.Verify(vk, proof, pubSignals)
140 assert.True(t, v)
141 }
142}
143
144func BenchmarkGenerateProof(b *testing.B) {
145 provingKeyJson, err := ioutil.ReadFile("../testdata/big/proving_key.json")
146 require.Nil(b, err)
147 pk, err := parsers.ParsePk(provingKeyJson)
148 require.Nil(b, err)
149
150 witnessJson, err := ioutil.ReadFile("../testdata/big/witness.json")
151 require.Nil(b, err)
152 w, err := parsers.ParseWitness(witnessJson)
153 require.Nil(b, err)
154
155 for i := 0; i < b.N; i++ {
156 GenerateProof(pk, w)
157 }
158}