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	. "gnark-plonky2-verifier/field"
 5	"gnark-plonky2-verifier/utils"
 6	"testing"
 7
 8	"github.com/consensys/gnark-crypto/ecc"
 9	"github.com/consensys/gnark/frontend"
10	"github.com/consensys/gnark/test"
11)
12
13var testCurve = ecc.BN254
14
15type TestPublicInputsHashCircuit struct {
16	In  [3]frontend.Variable
17	Out [4]frontend.Variable
18}
19
20func (circuit *TestPublicInputsHashCircuit) Define(api frontend.API) error {
21	field := NewFieldAPI(api)
22
23	// BN254 -> Binary(64) -> F
24	var input [3]F
25	for i := 0; i < 3; i++ {
26		input[i] = field.FromBinary(api.ToBinary(circuit.In[i], 64)).(F)
27	}
28
29	poseidonChip := &PoseidonChip{api: api, field: field}
30	output := poseidonChip.HashNoPad(input[:])
31
32	// Check that output is correct
33	for i := 0; i < 4; i++ {
34		field.AssertIsEqual(
35			output[i],
36			field.FromBinary(api.ToBinary(circuit.Out[i])).(F),
37		)
38	}
39
40	return nil
41}
42
43func TestPublicInputsHashWitness(t *testing.T) {
44	assert := test.NewAssert(t)
45
46	testCase := func(in [3]frontend.Variable, out [4]frontend.Variable) {
47		circuit := TestPublicInputsHashCircuit{In: in, Out: out}
48		witness := TestPublicInputsHashCircuit{In: in, Out: out}
49		err := test.IsSolved(&circuit, &witness, testCurve.ScalarField())
50		assert.NoError(err)
51	}
52
53	inStr := []string{"0", "1", "3736710860384812976"}
54	outStr := []string{"8416658900775745054", "12574228347150446423", "9629056739760131473", "3119289788404190010"}
55	var in [3]frontend.Variable
56	var out [4]frontend.Variable
57	copy(in[:], utils.StrArrayToFrontendVariableArray(inStr))
58	copy(out[:], utils.StrArrayToFrontendVariableArray(outStr))
59	testCase(in, out)
60}