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 witnessBinFile, err := os.Open("../testdata/" + circuit + "/witness.bin")
43 require.Nil(t, err)
44 defer witnessBinFile.Close()
45 w, err := parsers.ParseWitnessBin(witnessBinFile)
46 require.Nil(t, err)
47
48 beforeT := time.Now()
49 proof, pubSignals, err := GenerateProof(pk, w)
50 assert.Nil(t, err)
51 fmt.Println("proof generation time for "+circuit+" elapsed:", time.Since(beforeT))
52
53 proofStr, err := parsers.ProofToJson(proof)
54 assert.Nil(t, err)
55
56 err = ioutil.WriteFile("../testdata/"+circuit+"/proof.json", proofStr, 0644)
57 assert.Nil(t, err)
58 publicStr, err := json.Marshal(parsers.ArrayBigIntToString(pubSignals))
59 assert.Nil(t, err)
60 err = ioutil.WriteFile("../testdata/"+circuit+"/public.json", publicStr, 0644)
61 assert.Nil(t, err)
62
63 // verify the proof
64 vkJson, err := ioutil.ReadFile("../testdata/" + circuit + "/verification_key.json")
65 require.Nil(t, err)
66 vk, err := parsers.ParseVk(vkJson)
67 require.Nil(t, err)
68
69 v := verifier.Verify(vk, proof, pubSignals)
70 assert.True(t, v)
71
72 // to verify the proof with snarkjs:
73 // snarkjs verify --vk testdata/circuitX/verification_key.json -p testdata/circuitX/proof.json --pub testdata/circuitX/public.json
74}
75
76func BenchmarkGenerateProof(b *testing.B) {
77 // benchmark with a circuit of 10000 constraints
78 provingKeyJson, err := ioutil.ReadFile("../testdata/circuit5k/proving_key.json")
79 require.Nil(b, err)
80 pk, err := parsers.ParsePk(provingKeyJson)
81 require.Nil(b, err)
82
83 witnessJson, err := ioutil.ReadFile("../testdata/circuit5k/witness.json")
84 require.Nil(b, err)
85 w, err := parsers.ParseWitness(witnessJson)
86 require.Nil(b, err)
87
88 for i := 0; i < b.N; i++ {
89 GenerateProof(pk, w)
90 }
91}