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}