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	gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks"
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	glAPI := gl.NewGoldilocksApi(api)
22
23	// BN254 -> Binary(64) -> F
24	var input [3]gl.GoldilocksVariable
25	for i := 0; i < 3; i++ {
26		input[i] = gl.NewVariable(api.FromBinary(api.ToBinary(circuit.In[i], 64)...))
27	}
28
29	poseidonChip := &GoldilocksChip{api: api, gl: *glAPI}
30	output := poseidonChip.HashNoPad(input[:])
31
32	// Check that output is correct
33	for i := 0; i < 4; i++ {
34		glAPI.AssertIsEqual(
35			output[i],
36			gl.NewVariable(api.FromBinary(api.ToBinary(circuit.Out[i])...)),
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[:], gl.StrArrayToFrontendVariableArray(inStr))
58	copy(out[:], gl.StrArrayToFrontendVariableArray(outStr))
59	testCase(in, out)
60}
61
62func TestPublicInputsHashWitness2(t *testing.T) {
63	assert := test.NewAssert(t)
64
65	inStr := []string{"0", "1", "3736710860384812976"}
66	outStr := []string{"8416658900775745054", "12574228347150446423", "9629056739760131473", "3119289788404190010"}
67	var in [3]frontend.Variable
68	var out [4]frontend.Variable
69	copy(in[:], gl.StrArrayToFrontendVariableArray(inStr))
70	copy(out[:], gl.StrArrayToFrontendVariableArray(outStr))
71
72	circuit := TestPublicInputsHashCircuit{In: in, Out: out}
73	witness := TestPublicInputsHashCircuit{In: in, Out: out}
74
75	assert.ProverSucceeded(
76		&circuit,
77		&witness,
78		test.WithBackends(backend.GROTH16),
79		test.WithCurves(ecc.BN254),
80		test.NoFuzzing(),
81		test.NoSerializationChecks(),
82	)
83}