Skip to content

Latest commit

 

History

History
122 lines (86 loc) · 4.4 KB

readme.md

File metadata and controls

122 lines (86 loc) · 4.4 KB
title tags
02. 基本类型
cairo
starknet
felt
string
uint

WTF Cairo极简教程: 2. Primitive Types

我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 2.2.0版本。

推特:@0xAA_Science@WTFAcademy_

WTF Academy 社群:Discord微信群官网 wtf.academy

所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo


在本章节中,我们将介绍 Cairo 中的基本数据类型,包括 felt、无符号整数、布尔值和字符串。

Cairo是一种静态类型语言,这意味着它在编译时必须知道所有变量的类型。编译器也可以根据值及其用法推断所需的类型。

// 以下两种定义方法效果相同
let x:felt252 = 6;
let x = 6;

felt

felt域元素)是 Cairo 中最基本的数据类型,也是其他数据类型的构建基石。它的取值范围为0≤x<P中的整数,其中P为一个非常大的素数, ${2^{251}} + 17 \cdot {2^{192}} + 1$ 。当值超过这个范围时,会发生溢出(或下溢),结果会模P。

fn overflow(self: @ContractState) -> felt252 {
    let x: felt252 = -1;
    //0x800000000000011000000000000000000000000000000000000000000000000
    //=2^251+17⋅2^192
    return x;
}

felt支持加法、减法、乘法和除法等基本运算。与整型不同,'felt'在除法时会返回满足条件的整数,例如7/3,整型的结果通常为2,而felt252的结果x则会满足(x*3)%P=7这个式子。

值得注意的是,在Cairo2.6.0版本中,felt252被禁止使用除法。

error: Trait has no implementation in context: core::traits::Div::<core::felt252>
    let x: felt252 = 5 / 2;
                     ^***^

整数

Cairo支持不同大小的无符号整数,包括 u8(uint8,无符号 8 位整数)、u16u32u64u128uint256 。在使用时,在数字的后面标记,例如'1_u8'。需要注意的是,u256是一个有两个字段的结构: u256{ low : u128 , high : u128 }

// 无符号整数
// 无符号 8 位整数
let x_u8 = 1_u8;
// 无符号 16 位整数
let x_u16 = 1_u16;
// 无符号 32 位整数
let x_u32 = 1_u32;
// 无符号 64 位整数
let x_u64 = 1_u64;
// 无符号 128 位整数
let x_u128 = 1_u128;
// 无符号 256 位整数
let x_256 = u256 { low: 10, high : 0};
// 无符号大小整数(通常用于表示索引和长度)
let value_usize = 1_usize;

整数支持加法、减法、乘法、除法和余数的运算。

布尔值

Cairo支持布尔数据类型,它有两种可能的值:truefalse。在声明时不允许使用整数文本(即0而不是false)进行声明。

// 布尔值:真或假
let x_bool = true;
let y_bool = false;

字符串

Cairo没有字符串的原生类型,但提供了两种处理它们的方法:使用简单引号的短字符串和使用双引号的ByteArray。

短字符串

短字符串是一个ASCII字符串,其中每个字符都按照一个字节编码(具体参考ASCII表)。

Cairo使用felt的形式存储短字符串,因此仅支持长度少于 31 个字符的短字符串(31*8=248位,这是适合251位的最大8倍数)。

let x_char = 'C';
let x_char_in_hex = 0x43;

let x_string = 'WTF Academy';
let x_string_in_hex = 0x5754462041636164656D79;

字节数组字符串

在Cairo2.4.0中添加ByteArray结构后,不再局限于31个字符。这些字符串用双引号书写:

// 用 felt 表示短字符串
let x_long_string: ByteArray = "this is a string which has more than 31 characters";

总结

维护良好的编程习惯很重要,其中之一就是对未使用的变量进行特殊处理,在变量名前加'_',以标识这一点。这样不仅有助于代码的可读性,也方便后续的代码审查和维护

在本章中,我们探讨了Cairo中的基本类型,包括felt、无符号整数、布尔值和字符串。在接下来的章节中,我们将通过示例更深入地了解这些类型。