arnaucube
arnaucube/go-circom-prover-verifierPublic Self-hosted repository
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}