Skip to content

Commit

Permalink
implement RangeCheck
Browse files Browse the repository at this point in the history
  • Loading branch information
omerfirmak committed Oct 3, 2023
1 parent 11ab757 commit f0e1727
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
31 changes: 31 additions & 0 deletions pkg/vm/builtins/range_check.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package builtins

import (
"fmt"

"github.com/NethermindEth/cairo-vm-go/pkg/vm/memory"
"github.com/consensys/gnark-crypto/ecc/stark-curve/fp"
)

type RangeCheck struct{}

// 1 << 128
var max, _ = new(fp.Element).SetString("0x100000000000000000000000000000000")

func (r *RangeCheck) CheckWrite(segment *memory.Segment, offset uint64, value *memory.MemoryValue) error {
felt, err := value.ToFieldElement()
if err != nil {
return err
}

// felt >= (2^128)
if felt.Cmp(max) != -1 {
return fmt.Errorf("range check builtin failed for offset: %d value %s", offset, value)
}
return nil
}

func (r *RangeCheck) DeduceValue(segment *memory.Segment, offset uint64) error {
segment.Data[offset] = memory.EmptyMemoryValueAsFelt()
return nil
}
39 changes: 39 additions & 0 deletions pkg/vm/builtins/range_check_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package builtins

import (
"testing"

"github.com/NethermindEth/cairo-vm-go/pkg/vm/memory"
"github.com/consensys/gnark-crypto/ecc/stark-curve/fp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestRangeCheck(t *testing.T) {
builtin := RangeCheck{}

t.Run("write memory addr", func(t *testing.T) {
memoryAddress := memory.EmptyMemoryValueAsAddress()
assert.Error(t, builtin.CheckWrite(nil, 0, &memoryAddress))
})

t.Run("write out of range", func(t *testing.T) {
outOfRangeValueFelt, err := new(fp.Element).SetString("0x100000000000000000000000000000001")
require.NoError(t, err)
outOfRangeValue := memory.MemoryValueFromFieldElement(outOfRangeValueFelt)
assert.Error(t, builtin.CheckWrite(nil, 0, &outOfRangeValue))
})

t.Run("write in range", func(t *testing.T) {
f, err := new(fp.Element).SetString("0x44")
require.NoError(t, err)
v := memory.MemoryValueFromFieldElement(f)
assert.NoError(t, builtin.CheckWrite(nil, 0, &v))
})

t.Run("deduce", func(t *testing.T) {
segment := memory.EmptySegmentWithLength(3)
assert.NoError(t, builtin.DeduceValue(segment, 0))
require.Equal(t, memory.EmptyMemoryValueAsFelt(), segment.Data[0])
})
}

0 comments on commit f0e1727

Please sign in to comment.