Cairo 101 入门

1. Hello Cairo
2. 基本类型
3. 局部和状态变量
4. 变量可变性
5. 函数
6. 元组 Tuple
7. 数组
8. 结构体
9. 枚举
10. 映射和其他类型
11. 控制流
12. 模式匹配
13. Option
14. 类型转换
15. 构造函数
.
Hello Cairo

Cairo 是以太坊ZK-Rollup扩容方案 Starknet 上智能合约的编程语言。它也用于编写可证明程序。Cairo主要有两个特点:

  1. ZK友好: Cairo是图灵完备的通用可证明计算的编程语言,可以编译为 Stark 可证明程序。

  2. 难学: Cairo 学习曲线陡峭;并且现在属于开发早期,每个版本都会有很大改变。

目前 Cairo 版本为 2.2.0,基于 Rust,所以语法也很像 Rust,与之前的 0.x 版本有很大不同。学习 Rust 对学习 Cairo 有很大帮助,Rust中文资料汇总见链接。

开发工具

由于目前Cairo仍处于早期,工具还在开发中,并未成熟。我们可以选择使用本地工具scarb或者在线工具Starknet Remix来编译合约。

使用 Scarb

为了使用scarb,我们需要安装rust和scarb。

  1. 下载 Rust

  2. 安装 Rust:

    rustup override set stable && rustup update
  3. 确认 Rust 被正确安装:

    cargo test
  4. 如果你使用的系统是Linux或Mac,可以用下面的命令行安装,不然的话,你可以阅读[安装文档]。

    curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh
  5. 创建新项目项目(project和directory可以自定义):

    scarb new project/directory
  6. 编译合约:

    scarb build
  7. 如果要构建CASM,需要在Scarb.toml中添加:

    [lib]
    casm = true
  8. 如果要编译Starknet合约,需要在Scarb.toml中添加:

    [dependencies]
    starknet = ">=2.2.0"
    
    [[target.starknet-contract]]

更多Scarb用法见官网文档。

使用 Starknet Remix

  1. 进入Remix官网: remix.ethereum.org

  2. 进入扩展市场,搜索Starknet Remix,安装它。

  3. 选择并编辑合约,点击编译键(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 之旅!

Cairo 资料参考

  1. Cairo Book

  2. Cairo官方文档(英文)

  3. Starkling Cairo1

  4. Starknet Cairo 101

PreviousNext