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