|
package goldilocks
|
|
|
|
import (
|
|
"math/big"
|
|
"testing"
|
|
|
|
"github.com/consensys/gnark-crypto/ecc"
|
|
"github.com/consensys/gnark/backend"
|
|
"github.com/consensys/gnark/frontend"
|
|
"github.com/consensys/gnark/test"
|
|
)
|
|
|
|
type TestGoldilocksRangeCheckCircuit struct {
|
|
X frontend.Variable
|
|
}
|
|
|
|
func (c *TestGoldilocksRangeCheckCircuit) Define(api frontend.API) error {
|
|
glApi := NewGoldilocksApi(api)
|
|
glApi.RangeCheck(NewVariable(c.X))
|
|
return nil
|
|
}
|
|
func TestGoldilocksRangeCheck(t *testing.T) {
|
|
assert := test.NewAssert(t)
|
|
|
|
var circuit, witness TestGoldilocksRangeCheckCircuit
|
|
|
|
witness.X = 1
|
|
assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoSerializationChecks())
|
|
|
|
witness.X = 0
|
|
assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoSerializationChecks())
|
|
|
|
witness.X = MODULUS
|
|
assert.ProverFailed(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoSerializationChecks())
|
|
|
|
one := big.NewInt(1)
|
|
maxValidVal := new(big.Int).Sub(MODULUS, one)
|
|
witness.X = maxValidVal
|
|
assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16))
|
|
}
|
|
|
|
type TestGoldilocksMulAddCircuit struct {
|
|
X, Y, Z frontend.Variable
|
|
ExpectedResult frontend.Variable
|
|
}
|
|
|
|
func (c *TestGoldilocksMulAddCircuit) Define(api frontend.API) error {
|
|
glApi := NewGoldilocksApi(api)
|
|
calculateValue := glApi.MulAdd(NewVariable(c.X), NewVariable(c.Y), NewVariable(c.Z))
|
|
api.AssertIsEqual(calculateValue.Limb, c.ExpectedResult)
|
|
return nil
|
|
}
|
|
|
|
func TestGoldilocksMulAdd(t *testing.T) {
|
|
assert := test.NewAssert(t)
|
|
|
|
var circuit, witness TestGoldilocksMulAddCircuit
|
|
|
|
witness.X = 1
|
|
witness.Y = 2
|
|
witness.Z = 3
|
|
witness.ExpectedResult = 5
|
|
assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoFuzzing())
|
|
|
|
bigOperand := new(big.Int).SetUint64(9223372036854775808)
|
|
expectedValue, _ := new(big.Int).SetString("18446744068340842500", 10)
|
|
|
|
witness.X = bigOperand
|
|
witness.Y = bigOperand
|
|
witness.Z = 3
|
|
witness.ExpectedResult = expectedValue
|
|
assert.ProverSucceeded(&circuit, &witness, test.WithCurves(ecc.BN254), test.WithBackends(backend.GROTH16), test.NoFuzzing())
|
|
}
|