felt252felt252是Cairo中基础类型,代表一个存储槽,未指定变量类型的字面量默认类型都是felt252。felt252可以
此文章使用的Cairo编译器版本:1.0.0-alpha.6。因为Cairo正在快速更新,所以不同版本的语法会有些许不同,未来将会将文章内容更新到稳定版本。
felt252是Cairo中基础类型,代表一个存储槽,未指定变量类型的字面量默认类型都是felt252。felt252可以是负数或者是0,它的取值范围是:
-X < felt < X, where X = 2^{251} + 17* 2^{192} + 1
任何在这个取值范围内的值都可以存储在felt252中。注意⚠️:并不是 -(2^251) ~ (2^251 - 1)
。
felt252既可以存整数,也可以存储字符串,下面👇是存储整数和字符串的例子:
use debug::PrintTrait;
fn main() {
// let关键字声明,直接用字面量赋值,默认类型应该是felt252
let x: felt252 = 5;
let y: felt252 = 'ppppppppppppppppppppppppppp';
let z: felt252 = 'ppppppppppppppppppppppppppp99999999999999'; // 溢出
x.print();
}
注意⚠️:是252不是256,而且felt后面接其他数字或者不接都会编译报错,例如
felt256 felt
短字符串用单引号表示,并且长度不能超过31个字符。短字符串本质上是felt252类型,只是表现形式为字符串,计算机通过ASCII协议将字符转换成数字。短字符串长度不能超过31个字符,本质上是不能超过felt252的最大值。
let mut my_first_initial = 'C';
Cairo1.0中,felt252不支持除法运算,也不支持取余,整型可以。
以下是Cairo 0.1中关于felt的描述:
flet是field elements的缩写,可以翻译为域元素。felt252与整型的区别主要体现在除法运算上。当出现不能整除的运算时,例如 7/3,整型运算的结果通常是 2,但是felt252不是。felt252 会始终满足 x3 = 7 这个等式,由于只能是整数,所以 x3 的值将会是一个巨大的整数,以至于溢出,溢出后的值刚好是 7。
在Cairo1.0中,felt252被禁止使用除法
use debug::PrintTrait;
fn main() {
let x = 7 / 3;
x.print();
}
// 以上代码将会的到如下错误
error: Trait has no implementation in context: core::traits::Div::<core::felt252>
--> f_felt252.cairo:4:13
let x = 7 / 3;
^***^
Error: failed to compile: src/f_felt252.cairo
核心库中包含了这些整型变量: u8, u16, u32 (usize), u64, u128, and u256
。他们都是用 felt252 实现的,并且自带整数溢出检测,溢出后触发Panic错误。
使用整型字面量时,需要显式指定字面量类型
let x = 2_u8;
但是2_u256
不可以,目前创建u256类型,需要使用其他类型来构建。u256在核心库里是一个结构体,其中的 high 和 low 涉及到 高地址段 和 低地址段 的概念,大家可以问一下AI🤖️
let z: u256 = u256 { high: 0_u128, low: 10_u128 }
不指定则默认为felt252类型
let y = 2;
整型支持大多数运算符,并且自带溢出检测,支持如下:
fn test_u8_operators() {
// 计算
assert(1_u8 + 3_u8 == 4_u8, '1 + 3 == 4');
assert(3_u8 + 6_u8 == 9_u8, '3 + 6 == 9');
assert(3_u8 - 1_u8 == 2_u8, '3 - 1 == 2');
assert(1_u8 * 3_u8 == 3_u8, '1 * 3 == 3');
assert(2_u8 * 4_u8 == 8_u8, '2 * 4 == 8');
assert(19_u8 / 7_u8 == 2_u8, '19 / 7 == 2');
assert(19_u8 % 7_u8 == 5_u8, '19 % 7 == 5');
assert(231_u8 - 131_u8 == 100_u8, '231-131=100');
// 比较
assert(1_u8 == 1_u8, '1 == 1');
assert(1_u8 != 2_u8, '1 != 2');
assert(1_u8 < 4_u8, '1 < 4');
assert(1_u8 <= 4_u8, '1 <= 4');
assert(!(4_u8 < 4_u8), '!(4 < 4)');
assert(4_u8 <= 4_u8, '4 <= 4');
assert(5_u8 > 2_u8, '5 > 2');
assert(5_u8 >= 2_u8, '5 >= 2');
assert(!(3_u8 > 3_u8), '!(3 > 3)');
assert(3_u8 >= 3_u8, '3 >= 3');
}
可以使用如下方式进行声明
let is_morning:bool = true;
let is_evening:bool = false;
暂不支持
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!