You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.4 KiB

package poseidon
import (
"testing"
"github.com/consensys/gnark-crypto/ecc"
"github.com/consensys/gnark/backend"
"github.com/consensys/gnark/frontend"
"github.com/consensys/gnark/test"
"github.com/succinctlabs/gnark-plonky2-verifier/field"
"github.com/succinctlabs/gnark-plonky2-verifier/utils"
)
var testCurve = ecc.BN254
type TestPublicInputsHashCircuit struct {
In [3]frontend.Variable
Out [4]frontend.Variable
}
func (circuit *TestPublicInputsHashCircuit) Define(api frontend.API) error {
fieldAPI := field.NewFieldAPI(api)
// BN254 -> Binary(64) -> F
var input [3]field.F
for i := 0; i < 3; i++ {
input[i] = fieldAPI.FromBits(api.ToBinary(circuit.In[i], 64)...)
}
poseidonChip := &PoseidonChip{api: api, fieldAPI: fieldAPI}
output := poseidonChip.HashNoPad(input[:])
// Check that output is correct
for i := 0; i < 4; i++ {
fieldAPI.AssertIsEqual(
output[i],
fieldAPI.FromBits(api.ToBinary(circuit.Out[i])...),
)
}
return nil
}
func TestPublicInputsHashWitness(t *testing.T) {
assert := test.NewAssert(t)
testCase := func(in [3]frontend.Variable, out [4]frontend.Variable) {
circuit := TestPublicInputsHashCircuit{In: in, Out: out}
witness := TestPublicInputsHashCircuit{In: in, Out: out}
err := test.IsSolved(&circuit, &witness, testCurve.ScalarField())
assert.NoError(err)
}
inStr := []string{"0", "1", "3736710860384812976"}
outStr := []string{"8416658900775745054", "12574228347150446423", "9629056739760131473", "3119289788404190010"}
var in [3]frontend.Variable
var out [4]frontend.Variable
copy(in[:], utils.StrArrayToFrontendVariableArray(inStr))
copy(out[:], utils.StrArrayToFrontendVariableArray(outStr))
testCase(in, out)
}
func TestPublicInputsHashWitness2(t *testing.T) {
assert := test.NewAssert(t)
inStr := []string{"0", "1", "3736710860384812976"}
outStr := []string{"8416658900775745054", "12574228347150446423", "9629056739760131473", "3119289788404190010"}
var in [3]frontend.Variable
var out [4]frontend.Variable
copy(in[:], utils.StrArrayToFrontendVariableArray(inStr))
copy(out[:], utils.StrArrayToFrontendVariableArray(outStr))
circuit := TestPublicInputsHashCircuit{In: in, Out: out}
witness := TestPublicInputsHashCircuit{In: in, Out: out}
assert.ProverSucceeded(
&circuit,
&witness,
test.WithBackends(backend.GROTH16),
test.WithCurves(ecc.BN254),
test.NoFuzzing(),
test.NoSerialization(),
)
}