Почему range_check_ptr проверяет [0, 2^128) вместо [0, P/2)

Согласно документу, войлок — это элемент поля, то есть любое целое число в диапазоне [0, P) с P = 2 ^ 251 + 17 * 2 ^ 192 + 1.

С другой стороны, range_check_ptr проверяет, находится ли войлок в пределах [0, 2^128).

Я не понимаю этого ограничения: почему бы не [0, 2^250), чтобы войлок каким-то образом был int250?

MWE:

      %lang starknet

from starkware.cairo.common.math import assert_nn

@view
func foo{range_check_ptr}() -> ():
    alloc_locals
    local x
    %{ ids.x = PRIME - 10 %}
    assert_nn(a=x)
    return ()
end

это не удается из-за того, какassert_nnиrange_check_ptrопределены, но я не могу понять, почему это так:

      Error at pc=0:0:
Got an exception while executing a hint.
    %{
        ^^
Cairo traceback (most recent call last):
contracts/main.cairo:6:6: (pc=0:13)
func foo{range_check_ptr}() -> ():
     ^**^
contracts/tmp.cairo:10:5: (pc=0:8)
    assert_nn(a=x)
    ^************^

Traceback (most recent call last):
  File "/Users/clementwalter/.pyenv/versions/3.9.13/envs/starksheet/lib/python3.9/site-packages/starkware/cairo/common/math.cairo", line 43, in <module>
    assert 0 <= ids.a % PRIME < range_check_builtin.bound, f\'a = {ids.a} is out of range.\'
AssertionError: a = 3618502788666131213697322783095070105623107215331596699973092056135872020471 is out of range.'})

1 ответ

Оба варианта допустимы. Вы можете использовать 2 проверки диапазона 250 для имитации проверки диапазона 128 или проверки диапазона 3-128 для имитации проверки диапазона 250. Это сводится к производительности (чем меньше, тем лучше) и к тому, что является более распространенным использованием.

Другие вопросы по тегам