【发布时间】: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_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.'})
【问题讨论】:
标签: starknet cairo-lang