package goldilocks import ( "fmt" "math/big" "os" "testing" "github.com/consensys/gnark-crypto/ecc" "github.com/consensys/gnark/backend" "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/frontend/cs/scs" "github.com/consensys/gnark/profile" "github.com/consensys/gnark/test" ) type TestGoldilocksRangeCheckCircuit struct { X frontend.Variable } func (c *TestGoldilocksRangeCheckCircuit) Define(api frontend.API) error { glApi := New(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 TestGoldilocksRangeCheckBenchmarkCircuit struct { X []frontend.Variable } func (c *TestGoldilocksRangeCheckBenchmarkCircuit) Define(api frontend.API) error { glApi := New(api) for _, x := range c.X { glApi.RangeCheck(NewVariable(x)) glApi.Reduce(NewVariable(x)) } return nil } func BenchmarkGoldilocksRangeCheck(b *testing.B) { var sizes = []int{5, 10, 15} for i := 0; i < len(sizes); i++ { var circuit, witness TestGoldilocksRangeCheckBenchmarkCircuit circuit.X = make([]frontend.Variable, 2<