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}