W3

Cairo

Cairo 2.x

Starknet

为 STARK 证明系统设计的语言,原生支持可证明计算

Cairo 从零为 zk 证明设计:程序执行轨迹会生成 STARK 证明,在以太坊上验证。Cairo 2 引入了类似 Rust 的所有权与 trait 体系,编译目标是 Sierra 中间表示。理解重点在于「存储变量(storage var)」「合约入口(entry point)」「felt252 这个原生字段类型」。

2 个语法章节2 段可复制代码含在线练习

从 Solidity 视角看差异

如果已经会 Solidity,这张表比从头读语法快得多。

差异点说明
入口注解用 #[external(v0)] 暴露外部入口,#[abi(embed_v0)] 嵌入接口实现。
存储访问状态在 self.xxx 下,通过 ContractState trait 读写;Map 是 Starknet 原生存储映射,不可遍历。
数据类型felt252 是原生字段元素(约 251 位),u256 由两个 felt252 组成,成本显著更高。
错误处理用 Result 与 panic! / assert! 混合风格;断言失败会回滚整笔交易。
1

合约结构与存储

1 段代码

Starknet 合约由 #[starknet::contract] 标注,#[storage] 声明状态布局。

  • #[starknet::interface] 定义 ABI,配合 #[abi(embed_v0)] 自动生成桩代码
  • 构造器 #[constructor] 返回 self,用来初始化存储
  • Map<key, value> 是可寻址存储,不能遍历,需要自己维护索引
  • LegacyMap 是旧写法,新合约统一用 Map
Starknet 存储合约
Starknet 存储合约Cairo

@ContractState 只读用 self: @T,要修改用 ref self: T,编译器会强制区分。

2

错误处理与断言

1 段代码

Cairo 用 panic! 与 assert!,也支持自定义错误 enum 以便前端解析。

  • assert!(cond, "message") 失败时回滚交易并写入简短字符串
  • panic_with_felt252 用于返回错误码,便于程序化处理
  • Result<T, E> 用于库内部逻辑,外层用手动 unwrap 或显式 match 处理
  • Starknet 交易回滚同样不消耗已执行部分的 Gas,但会收一笔执行费
断言与自定义错误
断言与自定义错误Cairo

本章练习

这一段要让你看懂:Starknet 的存储与算术基本单位是 felt252(约 251 位的字段元素),不是 EVM 的 256 位整数。u256 由两个 felt252 拼成,成本显著更高;地址也只有 251 位有效范围。

试一试 · felt252、u256 与地址边界

可直接改代码 · 在浏览器沙箱里真跑
playground.jsJavaScript
运行环境:iframe 沙箱(无 cookie 权限)。只支持纯 JS 片段,不支持 import / require;需要模块请用下方的完整示例复制到项目里。
检查点(跑完后逐条核对)
  • felt252 的位数是 252(P 的二进制长度为 252 位)
  • P 小于 2^256,说明 felt252 装不下 uint256 全范围
  • felt252 的溢出是模 P 回绕,不是 EVM 式的截断
  • 2^128 拆出的 low 是 0、high 是 1

切换其他语言