WTF Cairo极简教程: 1. Hello Cairo
我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 2.2.0版本。
WTF Academy 社群:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo
Cairo 简介
Cairo 是以太坊ZK-Rollup扩容方案 Starknet 上智能合约的编程语言。它也用于编写可证明程序。Cairo主要有两个特点:
ZK友好:
Cairo是图灵完备的通用可证明计算的编程语言,可以编译为 Stark 可证明程序。难学:
Cairo学习曲线陡峭;并且现在属于开发早期,每个版本都会有很大改变。
目前 Cairo 版本为 2.2.0,基于 Rust,所以语法也很像 Rust,与之前的 0.x 版本有很大不同。学习 Rust 对学习 Cairo 有很大帮助,Rust中文资料汇总见链接。
开发工具
由于目前Cairo仍处于早期,工具还在开发中,并未成熟。我们可以选择使用本地工具scarb或者在线工具Starknet Remix来编译合约。
使用 Scarb
为了使用scarb,我们需要安装rust和scarb。
下载 Rust
安装 Rust:
rustup override set stable && rustup update确认 Rust 被正确安装:
cargo test如果你使用的系统是
Linux或Mac,可以用下面的命令行安装,不然的话,你可以阅读[安装文档]。curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh创建新项目项目(project和directory可以自定义):
scarb new project/directory编译合约:
scarb build如果要构建CASM,需要在
Scarb.toml中添加:[lib]
casm = true如果要编译Starknet合约,需要在
Scarb.toml中添加:[dependencies]
starknet = ">=2.2.0"
[[target.starknet-contract]]
更多Scarb用法见官网文档。
使用 Starknet Remix
进入Remix官网: remix.ethereum.org
进入扩展市场,搜索
Starknet Remix,安装它。选择并编辑合约,点击编译键(Compile)进行编译。
Hello Cairo
下面,我们来写第一个Cairo合约:Hello Cairo。
#[starknet::contract]
mod HelloCairo {
#[storage]
struct Storage {}
#[external(v0)]
fn hello_cairo(self: @ContractState) -> felt252 {
return 'Hello Cairo!';
}
}
我们拆开分析,学习cairo合约源文件的结构:
第1行利用 #[starknet::contract] 声明了这段代码为 Starknet 合约。如果不声明,则不能部署在 Starknet 上。
#[starknet::contract]
第2行利用 mod 模块关键字创建了合约,名为 HelloCairo。这与 Rust 中的 mod 类似,是一系列元素的集合,包括结构体、函数等。
mod HelloCairo {
}
第3-4行,我们声明了合约的状态变量。在Cairo中,即使合约没有状态变量,也需要声明。
#[storage]
struct Storage {}
之后,我们写了一个函数 hello_cairo。第6行,我们用 #[external(v0)] 属性修饰这个函数。与solidity中的类似external类似,该函数可以被外部调用。
#[external(v0)]
第7-9行我们声明了 hello_cairo 函数。它只有一个参数self: @ContractState,表示它是view函数。它有一个返回值,类型为felt252:felt(field element,域元素)是 cairo 的基本类型之一,我们会在之后的章节更详细的介绍它。在函数体中,我们将返回值设为用felt252表示的短字符串(长度小于32个字符) Hello Cairo!。
fn hello_cairo(self: @ContractState) -> felt252 {
return 'Hello Cairo!';
}
编译并部署代码
将上面的合约代码保存到 HelloCairo.cairo 文件中,然后使用 scarb 进行编译:
scarb build
编译成功后!
总结
这一讲,我们简单介绍了Cairo语言,并编译了第一个Cairo智能合约--Hello Cairo。之后,我们将继续 Cairo 之旅!