arnaucube
arnaucube/go-circom-prover-verifierPublic Self-hosted repository
go-circom-prover-verifier/parsers/parsers_test.go
parsers/parsers_test.goRaw
  1package parsers
  2
  3import (
  4	"io/ioutil"
  5	"os"
  6	"testing"
  7
  8	"github.com/stretchr/testify/assert"
  9	"github.com/stretchr/testify/require"
 10)
 11
 12func TestParseArrayG1(t *testing.T) {
 13	aS := [][]string{
 14		{
 15			"16145916318196730299582072104388453231952213805668281741813587224450782397538",
 16			"4434505318477484327659527264104806919103674231447634885054368605283938696207",
 17			"1",
 18		},
 19		{
 20			"10618406967550056457559358662746625591602641004174976323307214433994084907915",
 21			"1843236360452735081347085412539192450068665510574800388201121698908391533923",
 22			"1",
 23		},
 24		{
 25			"1208972877970123411566574123860641832032384890981476033353526096830198333194",
 26			"777503551507025252294438107100944741641946695980350712141258191590862204805",
 27			"1",
 28		},
 29		{
 30			"0",
 31			"1",
 32			"0",
 33		},
 34	}
 35
 36	a, err := arrayStringToG1(aS)
 37	assert.Nil(t, err)
 38	assert.Equal(t, "bn256.G1(23b243c928ce40c4cc2dad366e9f61723aef65866e1c66f42a08697f2f030462, 09cdd7500688fb487ec9f27b5a732d68fa0f3ddca5c2c790e330fdfb03b77c0f)", a[0].String())
 39	assert.Equal(t, "bn256.G1(1779ce2c586b5fc523e72e755d969a63473052aaad7c11eb5bf0ecdcfdfefb8b, 04133c1c74206dace57cd3d76ce59be381bbf08f51a5b3edc2b0c183d43eed63)", a[1].String())
 40	assert.Equal(t, "bn256.G1(02ac4120598d2f2bb81bc09b8df596403360577b0c5ff52485d1ef2200f23f0a, 01b80d298de75f867d6484c55c3da02c042bb4eb9a1734d3386786aaa669af85)", a[2].String())
 41	assert.Equal(t, "bn256.G1(0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000001)", a[3].String())
 42}
 43
 44func TestParseG2(t *testing.T) {
 45	aS := [][]string{
 46		{
 47			"9283666785342556550467669770956850930982548182701254051508520248901282197973",
 48			"11369378229277445316894458966429873744779877313900506577160370623273013178252",
 49		},
 50		{
 51			"10625777544326349817513295021482494426101347915428005055375725845993157551870",
 52			"21401790227434807639472120486932615400751346915707967674912972446672152512583",
 53		},
 54		{
 55			"1",
 56			"0",
 57		},
 58	}
 59
 60	a, err := stringToG2(aS)
 61	assert.Nil(t, err)
 62	assert.Equal(t, "bn256.G2((1922d70c934543aa655ec3277f7fa10a25ec973a4f001a7c54ce4954b4916f8c, 14865e836947c42cf35b47d30e06535fff9dab319c4296e28afde368960671d5), (2f50fbe77925b0a9d718c9ab38638bafa7c65f43f0d09035e518df97ad294847, 177dfa1a3b8627faf0425d9511bcb4c6ca986ea05e3803b5c643c35b94a7e6fe))", a.String())
 63
 64	aS = [][]string{
 65		{
 66			"13973091636763944887728510851169742544309374663995476311690518173988838518856",
 67			"12903946180439304546475897520537621821375470264150438270817301786763517825250",
 68		},
 69		{
 70			"370374369234123593044872519351942112043402224488849374153134091815693350697",
 71			"17423079115073430837335625309232513526393852743032331213038909731579295753224",
 72		},
 73		{
 74			"1",
 75			"0",
 76		},
 77	}
 78	a, err = stringToG2(aS)
 79	assert.Nil(t, err)
 80	assert.Equal(t, "bn256.G2((1c875fed67fff3b35f115b03706ec45f281b5f6cc71a99107240e09fce4910e2, 1ee47d566e9a099626b9860bcd96f6d4a1ed65f115d3efa8e05e5f42cc793048), (26851d022ce9961df65a430811824aaf3118710ac03b0614a50c05ee27d8e408, 00d19fdce25b0d78fb317a5f1789823b7ed76274b0d1be9c685792c73b347729))", a.String())
 81}
 82
 83func TestParseArrayG2(t *testing.T) {
 84	aS := [][][]string{
 85		{
 86			{
 87				"0",
 88				"0",
 89			},
 90			{
 91				"1",
 92				"0",
 93			},
 94			{
 95				"0",
 96				"0",
 97			},
 98		},
 99		{
100			{
101				"0",
102				"0",
103			},
104			{
105				"1",
106				"0",
107			},
108			{
109				"0",
110				"0",
111			},
112		},
113		{
114			{
115				"0",
116				"0",
117			},
118			{
119				"1",
120				"0",
121			},
122			{
123				"0",
124				"0",
125			},
126		},
127		{
128			{
129				"9283666785342556550467669770956850930982548182701254051508520248901282197973",
130				"11369378229277445316894458966429873744779877313900506577160370623273013178252",
131			},
132			{
133				"10625777544326349817513295021482494426101347915428005055375725845993157551870",
134				"21401790227434807639472120486932615400751346915707967674912972446672152512583",
135			},
136			{
137				"1",
138				"0",
139			},
140		},
141	}
142
143	a, err := arrayStringToG2(aS)
144	assert.Nil(t, err)
145	assert.Equal(t, "bn256.G2((0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000), (0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000001))", a[0].String())
146	assert.Equal(t, "bn256.G2((1922d70c934543aa655ec3277f7fa10a25ec973a4f001a7c54ce4954b4916f8c, 14865e836947c42cf35b47d30e06535fff9dab319c4296e28afde368960671d5), (2f50fbe77925b0a9d718c9ab38638bafa7c65f43f0d09035e518df97ad294847, 177dfa1a3b8627faf0425d9511bcb4c6ca986ea05e3803b5c643c35b94a7e6fe))", a[3].String())
147
148}
149
150func testCircuitParseWitnessBin(t *testing.T, circuit string) {
151	witnessBinFile, err := os.Open("../testdata/" + circuit + "/witness.bin")
152	require.Nil(t, err)
153	defer witnessBinFile.Close()
154	witness, err := ParseWitnessBin(witnessBinFile)
155	require.Nil(t, err)
156
157	witnessJson, err := ioutil.ReadFile("../testdata/" + circuit + "/witness.json")
158	require.Nil(t, err)
159	w, err := ParseWitness(witnessJson)
160	require.Nil(t, err)
161
162	assert.Equal(t, len(w), len(witness))
163	assert.Equal(t, w[0], witness[0])
164	assert.Equal(t, w[1], witness[1])
165	assert.Equal(t, w[10], witness[10])
166	assert.Equal(t, w[len(w)-3], witness[len(w)-3])
167	assert.Equal(t, w[len(w)-2], witness[len(w)-2])
168	assert.Equal(t, w[len(w)-1], witness[len(w)-1])
169}
170
171func TestParseWitnessBin(t *testing.T) {
172	testCircuitParseWitnessBin(t, "circuit1k")
173	testCircuitParseWitnessBin(t, "circuit5k")
174}
175
176func TestProofSmartContractFormat(t *testing.T) {
177	proofJson, err := ioutil.ReadFile("../testdata/circuit1k/proof.json")
178	require.Nil(t, err)
179	proof, err := ParseProof(proofJson)
180	require.Nil(t, err)
181	pS := ProofToString(proof)
182
183	pSC := ProofToSmartContractFormat(proof)
184	assert.Nil(t, err)
185	assert.Equal(t, pS.A[0], pSC.A[0])
186	assert.Equal(t, pS.A[1], pSC.A[1])
187	assert.Equal(t, pS.B[0][0], pSC.B[0][1])
188	assert.Equal(t, pS.B[0][1], pSC.B[0][0])
189	assert.Equal(t, pS.B[1][0], pSC.B[1][1])
190	assert.Equal(t, pS.B[1][1], pSC.B[1][0])
191	assert.Equal(t, pS.C[0], pSC.C[0])
192	assert.Equal(t, pS.C[1], pSC.C[1])
193	assert.Equal(t, pS.Protocol, pSC.Protocol)
194
195	pSC2 := ProofStringToSmartContractFormat(pS)
196	assert.Equal(t, pSC, pSC2)
197
198}
199
200func testCircuitParsePkBin(t *testing.T, circuit string) {
201	pkBinFile, err := os.Open("../testdata/" + circuit + "/proving_key.bin")
202	require.Nil(t, err)
203	defer pkBinFile.Close()
204	pk, err := ParsePkBin(pkBinFile)
205	require.Nil(t, err)
206
207	pkJson, err := ioutil.ReadFile("../testdata/" + circuit + "/proving_key.json")
208	require.Nil(t, err)
209	pkJ, err := ParsePk(pkJson)
210	require.Nil(t, err)
211
212	assert.Equal(t, pkJ.NVars, pk.NVars)
213	assert.Equal(t, pkJ.NPublic, pk.NPublic)
214	assert.Equal(t, pkJ.DomainSize, pk.DomainSize)
215	assert.Equal(t, pkJ.VkAlpha1, pk.VkAlpha1)
216	assert.Equal(t, pkJ.VkBeta1, pk.VkBeta1)
217	assert.Equal(t, pkJ.VkDelta1, pk.VkDelta1)
218	assert.Equal(t, pkJ.VkDelta2, pk.VkDelta2)
219	assert.Equal(t, pkJ.PolsA, pk.PolsA)
220	assert.Equal(t, pkJ.PolsB, pk.PolsB)
221	assert.Equal(t, pkJ.A, pk.A)
222	assert.Equal(t, pkJ.B1, pk.B1)
223	assert.Equal(t, pkJ.B2, pk.B2)
224	assert.Equal(t, pkJ.C, pk.C)
225	assert.Equal(t, pkJ.HExps[:pkJ.DomainSize], pk.HExps[:pk.DomainSize]) // circom behaviour
226}
227
228func TestParsePkBin(t *testing.T) {
229	testCircuitParsePkBin(t, "circuit1k")
230	testCircuitParsePkBin(t, "circuit5k")
231}
232
233func benchmarkParsePk(b *testing.B, circuit string) {
234	pkJson, err := ioutil.ReadFile("../testdata/" + circuit + "/proving_key.json")
235	require.Nil(b, err)
236
237	pkBinFile, err := os.Open("../testdata/" + circuit + "/proving_key.bin")
238	require.Nil(b, err)
239	defer pkBinFile.Close()
240
241	b.Run("Parse Pk bin "+circuit, func(b *testing.B) {
242		for i := 0; i < b.N; i++ {
243			ParsePk(pkJson)
244		}
245	})
246	b.Run("Parse Pk json "+circuit, func(b *testing.B) {
247		for i := 0; i < b.N; i++ {
248			ParsePkBin(pkBinFile)
249		}
250	})
251}
252
253func BenchmarkParsePk(b *testing.B) {
254	benchmarkParsePk(b, "circuit1k")
255	benchmarkParsePk(b, "circuit5k")
256	// benchmarkParsePk(b, "circuit10k")
257	// benchmarkParsePk(b, "circuit20k")
258}