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
 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}