【问题标题】:Why does range_check_ptr chek for [0, 2^128) instead of [0, P/2)为什么 range_check_ptr chek [0, 2^128) 而不是 [0, P/2)
【发布时间】:2022-12-15 06:40:51
【问题描述】:

根据the doc,毛毡是一个字段元素,即 [0, P) 范围内的任何整数,P = 2^251 + 17 * 2^192 + 1。

另一方面,range_check_ptr 检查毛毡是否在 [0, 2^128) 范围内。

我不明白这个限制:为什么不 [0, 2^250) 这样一个 felt 在某种程度上是一个 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_nnrange_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.'})

【问题讨论】:

    标签: starknet cairo-lang


    【解决方案1】:

    两者都是有效的选项。您可以使用 2 250 范围检查来模拟 128 范围检查,或使用 3-128 范围检查来模拟 250 范围检查。它归结为性能(越少越好)以及更常见的用途。

    【讨论】:

    • 但作为一个开发自动取款机,由于 range_check_ptr 的一般使用,它似乎感觉是一个 int128 而它可能是一个 int250。如果我要用到128以上就需要用Cairo的Uint256,就是两个feel。这似乎是一种我不理解的浪费
    • 您可以使用毛毡,并使用像 is_le_felt 这样的东西
    • 我添加了一个 MWE 来展示我想了解的精确行为,即不是如何做,而是为什么要这样设计。从开发的角度来看,使用 starkware lib 似乎人为地将 felt 的大小减小为 int128
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2019-03-06
    • 2019-03-19
    相关资源
    最近更新 更多