gnark-plonky2-verifier/poseidon/public_inputs_hash_test.go
Kevin Jue c01f530fe1
fix: Support range checking non aligned bitwidth values (#47)
* initial commit

* most of the code done

* made global poseidon chip

* changed decompSize and added some panics

* made all gl chip as pointers

* working code

* revert go.mod and go.sum

* cleanup and comments

* cleaned up range checker selection

* renamed gnarkRangeCheckSelector to gnarkRangeCheckerSelector

* addressed PR comment

* addressed overflow issue identified by Veridise

* added some comments

* fixed some comment typos

* restore change made from commit hash 85d20ce and 9617141
2024-01-04 13:56:13 -08:00

84 lines
2.3 KiB
Go

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"
gl "github.com/succinctlabs/gnark-plonky2-verifier/goldilocks"
)
var testCurve = ecc.BN254
type TestPublicInputsHashCircuit struct {
In [3]frontend.Variable
Out [4]frontend.Variable
}
func (circuit *TestPublicInputsHashCircuit) Define(api frontend.API) error {
glAPI := gl.New(api)
// BN254 -> Binary(64) -> F
var input [3]gl.Variable
for i := 0; i < 3; i++ {
input[i] = gl.NewVariable(api.FromBinary(api.ToBinary(circuit.In[i], 64)...))
}
poseidonChip := &GoldilocksChip{api: api, gl: glAPI}
output := poseidonChip.HashNoPad(input[:])
// Check that output is correct
for i := 0; i < 4; i++ {
glAPI.AssertIsEqual(
output[i],
gl.NewVariable(api.FromBinary(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[:], gl.StrArrayToFrontendVariableArray(inStr))
copy(out[:], gl.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[:], gl.StrArrayToFrontendVariableArray(inStr))
copy(out[:], gl.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.NoSerializationChecks(),
)
}