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}