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 fieldAPI := NewFieldAPI(api)
22
23 // BN254 -> Binary(64) -> F
24 var input [3]F
25 for i := 0; i < 3; i++ {
26 input[i] = fieldAPI.FromBinary(api.ToBinary(circuit.In[i], 64)).(F)
27 }
28
29 poseidonChip := &PoseidonChip{api: api, fieldAPI: fieldAPI}
30 output := poseidonChip.HashNoPad(input[:])
31
32 // Check that output is correct
33 for i := 0; i < 4; i++ {
34 fieldAPI.AssertIsEqual(
35 output[i],
36 fieldAPI.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}