arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/poseidon/public_inputs_hash_test.go
poseidon/public_inputs_hash_test.goRaw
 1package poseidon
 2
 3import (
 4	"testing"
 5
 6	"github.com/consensys/gnark-crypto/ecc"
 7	"github.com/consensys/gnark/backend"
 8	"github.com/consensys/gnark/frontend"
 9	"github.com/consensys/gnark/test"
10	"github.com/succinctlabs/gnark-plonky2-verifier/field"
11	"github.com/succinctlabs/gnark-plonky2-verifier/utils"
12)
13
14var testCurve = ecc.BN254
15
16type TestPublicInputsHashCircuit struct {
17	In  [3]frontend.Variable
18	Out [4]frontend.Variable
19}
20
21func (circuit *TestPublicInputsHashCircuit) Define(api frontend.API) error {
22	fieldAPI := field.NewFieldAPI(api)
23
24	// BN254 -> Binary(64) -> F
25	var input [3]field.F
26	for i := 0; i < 3; i++ {
27		input[i] = fieldAPI.FromBits(api.ToBinary(circuit.In[i], 64)...)
28	}
29
30	poseidonChip := &PoseidonChip{api: api, fieldAPI: fieldAPI}
31	output := poseidonChip.HashNoPad(input[:])
32
33	// Check that output is correct
34	for i := 0; i < 4; i++ {
35		fieldAPI.AssertIsEqual(
36			output[i],
37			fieldAPI.FromBits(api.ToBinary(circuit.Out[i])...),
38		)
39	}
40
41	return nil
42}
43
44func TestPublicInputsHashWitness(t *testing.T) {
45	assert := test.NewAssert(t)
46
47	testCase := func(in [3]frontend.Variable, out [4]frontend.Variable) {
48		circuit := TestPublicInputsHashCircuit{In: in, Out: out}
49		witness := TestPublicInputsHashCircuit{In: in, Out: out}
50		err := test.IsSolved(&circuit, &witness, testCurve.ScalarField())
51		assert.NoError(err)
52	}
53
54	inStr := []string{"0", "1", "3736710860384812976"}
55	outStr := []string{"8416658900775745054", "12574228347150446423", "9629056739760131473", "3119289788404190010"}
56	var in [3]frontend.Variable
57	var out [4]frontend.Variable
58	copy(in[:], utils.StrArrayToFrontendVariableArray(inStr))
59	copy(out[:], utils.StrArrayToFrontendVariableArray(outStr))
60	testCase(in, out)
61}
62
63func TestPublicInputsHashWitness2(t *testing.T) {
64	assert := test.NewAssert(t)
65
66	inStr := []string{"0", "1", "3736710860384812976"}
67	outStr := []string{"8416658900775745054", "12574228347150446423", "9629056739760131473", "3119289788404190010"}
68	var in [3]frontend.Variable
69	var out [4]frontend.Variable
70	copy(in[:], utils.StrArrayToFrontendVariableArray(inStr))
71	copy(out[:], utils.StrArrayToFrontendVariableArray(outStr))
72
73	circuit := TestPublicInputsHashCircuit{In: in, Out: out}
74	witness := TestPublicInputsHashCircuit{In: in, Out: out}
75
76	assert.ProverSucceeded(
77		&circuit,
78		&witness,
79		test.WithBackends(backend.GROTH16),
80		test.WithCurves(ecc.BN254),
81		test.NoFuzzing(),
82		test.NoSerialization(),
83	)
84}