跳到主要内容

WTF Cairo极简教程: 3. 局部和状态变量

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

推特:@0xAA_Science@WTFAcademy_

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

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


在本章中,我们将介绍Cairo中的两种变量类型:局部变量local和状态变量storage

局部变量(Local Variables)

local 变量在函数内声明。它们是临时的,不会存储在链上。

// local 变量
#[external(v0)]
fn local_var(self: @ContractState){
// use `let` keywods to declare local variables
let local_felt: felt252 = 5;
let local_bool = true;
let local_uint = 1_u8;
}

状态变量(Storage Variables)

与Solidity类似,Cairo支持合约状态变量。它们会被记录在链上。你需要在合约中的一个名为 Storage 的特殊结构中声明状态变量,每个合约最多可以有一个 Storage 结构。

// 声明存储变量
#[storage]
struct Storage{
var_felt: felt252,
var_bool: bool,
var_uint: u8,
}

每个存储变量有两个成员函数:read()write()。你可以用下面的方法在函数中读取和写入状态变量。

注意:这里的self: @ContractState代表view函数,ref self: ContractState代表external函数。

// 读取存储变量
#[external(v0)]
fn read_bool(self: @ContractState) -> bool {
return self.var_bool.read();
}

// 写入存储变量
#[external(v0)]
fn write_bool(ref self: ContractState, bool_: bool) {
self.var_bool.write(bool_);
}

总结

在本章中,我们介绍了Cairo中的localstorage变量。