了解您需要了解的关于新的和改进的开罗的一切

去年 9 月,StarkWare 发布了两项重大公告,将显着改善网络上的开发人员体验。
他们是:
- Cairo 1.0:对 Starknet 的本地编程语言 Cairo 的巨大升级,它承诺为 Starknet 开发人员提供更安全、更简单和更好的编程体验。
- Sierra:一个中间表示层,将为开罗程序提供更大的长期稳定性。
许多开发人员在使用旧版本的 Cairo 编写代码时所面临的乏味体验将成为过去,因为 Cairo 1.0 使编写代码变得更加容易和整洁,因为该语言变得类似于 Rust。
通过对 Cairo 的这一更改,它具有额外的好处,可以让熟悉 Rust 的新开发人员加入 Starknet 生态系统。
这就是为什么随着 Sierra 的引入,Cairo 1.0 让 Starknet 开发者社区非常兴奋,这是有充分理由的。
在本文中,我们将教您如何编写和编译您的第一个 Cairo 1.0 合约,并探索改进后的所有新功能。现在让我们开始吧!
设置开发环境
在我们开始编写代码之前,我们需要设置一个开发环境。不幸的是,您可能熟悉的 Starknet工具,如 Protostar、Nile 或用于开发的官方 Starknet CLI,目前不支持 Cairo 1.0。这意味着我们需要使用替代解决方案……
我们通过克隆和修整官方仓库为 Cairo 1.0创建自定义开发环境解决了这个问题。您将需要克隆此存储库来编写和编译您的 Cairo 1.0 合约。

我们所有的合同都将进入 src 文件夹。我们已经创建了一个样板合同,我们将在本文的下一部分将其编译为sierra和casm 。
一旦我们克隆了 repo,我们现在可以继续激活我们的 Cairo 1.0 VS 代码扩展以进行语法高亮显示。
去做这个:
1. 安装 Node.js 18 LTS
2.导航到vscode-cairo文件夹
在终端中运行以下命令:
sudo npm install --global @vscode/vsce npm 安装 vsc包 代码 --install-extension cairo1*.vsix
3.搭建语言服务器:
cargo build --bin cairo-language-server --release
4.打开当前目录下的Vscode
运行这些命令:
npm 安装 npm 运行编译
5.最后,重新加载VScode并按F5
PS:您应该将这个额外的代码片段添加到VScode 中的settings.json文件中,以确保一切正常运行。
"cairo1.languageServerPath": "/Some/Path/target/release/cairo-language-server",

如果安装成功,请前往src/hello.cairo,您应该已激活语法高亮显示,如上图所示。
编译你的第一个 Cairo 1.0 合约
设置好我们的开发环境后,我们现在可以开始编译我们的 Cairo 1.0 合约了。
我们将使用位于src/hello.cairo中的简单合同
#[合同] mod HelloStarknet { 结构存储{ 平衡:感觉, } #[外部的] fn increase_balance(金额:毛毡){ 余额::写入(余额::读取()+金额); } #[看法] fn get_balance() -> 感觉 { 余额::读取() } }
该合约实现了简单的功能来增加和获取余额变量。#[contract] 表示我们正在编写 Starknet 合同而不是 Cairo 程序。
与我们直接编译为 Cairo 汇编 (casm) 的 0.x 合约不同,使用 Cairo 1.0,编译我们的合约将分两个阶段进行:
- 开罗 > 塞拉利昂
- 塞拉利昂 > 卡斯姆
Sierra代表安全中间表示,旨在构成 Cairo 程序及其字节码之间的表示层。Sierra 开启了证明每次 Cairo 运行的可能性,从而允许强大的拒绝服务攻击 (DoS) 保护。
要编译为 Sierra,请运行以下命令:
cargo run --bin starknet-compile -- src/hello.cairo src/hello.sierra --replace-ids
如果编译成功,您应该会在src/hello.sierra中看到 Sierra 输出。
要进一步从 Sierra 编译到 Casm,请运行以下命令:
货物运行 --bin starknet-sierra-compile -- src/hello.sierra src/hello.casm
如果编译成功,您应该会在src/hello.casm中看到 casm 输出。
Starknet Alpha v0.11.0 尚未发布,因此我们无法将编译好的合约部署到测试网或主网。但是,此网络升级预计将在 2023 年 2 月底进行。
您需要了解的关键 Cairo 1.0 功能
介绍 Cairo 1.0 附带的所有新功能需要不止一篇文章,但我们将在本节中探讨一些关键功能:
新语法
如前所述,Cairo 1.0 带有受 Rust 启发的更清晰、更好的语法。这包括采用类似 Rust 的特性,例如特征及其实现、模式匹配、恐慌等。
语言指令和导入
使用 Cairo 1.0,要开始编写 Starknet 合约,您必须指定宏:
#[合同]
虽然每个 Cairo 程序都必须实现一个 main 函数,但导入函数也变得更加容易。
你可以这样做:
使用 starknet::get_caller_address;
或者,您也可以导入整个“包”:
使用星网;
并像这样使用它:
starknet::get_caller_address()
数据类型
Starknet 生态系统的标志是 felt 数据类型,当然,它们不会很快消失!
除了 felt 数据类型外,还支持其他整数类型,如 u256、u128、u64、u32 和 u8。
虽然这些 Integer 类型是在幕后使用 felt 实现的,但它们被认为使用起来更安全,并且现在可以支持算术运算而无需自定义库。例如,您现在可以执行以下操作:
让总和 = 1_u128 + 2_u128; 让乘积 = 5_u256 * 10_u256;
这些运算符的使用是溢出保护的,如果检测到溢出会导致恐慌。
还支持类似于 Solidity 的地址的 contractAddress 数据类型,最近才在 Cairo 0.1 中实现。
类型文字
默认情况下,诸如 1、2、3 之类的数字文字是毡。但是,您可以通过附加数据类型为它们指定不同的数据类型,如下所示:
让 num_u256 = 1_u256
Let 关键字来统治他们
在 Cairo 1.0 中,我们最终消除了多个变量声明模式(tempvar、local 等),只接受使用 let 关键字。
这非常有帮助,因为我们终于告别了Revoked references编译器错误。
您现在还可以使用mut关键字创建可变变量。
结构和存储变量
Cairo 1.0 没有使用 @storage_var 装饰器,而是将合约分为三个主要部分:存储结构、合约特征及其实现。
所有存储变量都打包到一个名为Storage的结构中,尽管这可能会发生变化。
在撰写本文时,它是这样的:
结构存储{ 名称:毛毡, 符号: 感觉, 小数:u8, 总供应量:u256, 余额:LegacyMap::<felt, u256>, 津贴:LegacyMap::<(felt, felt), u256>, }
并且可以以这种方式读取或写入:
让名字 = 名字::读() 让名字 = 名字::写(_名字)
可以使用 LegacyMap 关键字创建映射,其中映射变量的数据类型插入在<和>之间。您还可以映射元组。
事件
事件允许合约在其执行过程中发出可以在 Starknet 之外使用的信息。
可以像这样创建一个事件:
#[事件] fn Transfer(from_: felt, to: felt, value: u256) {}
随后以这种方式发出:
转账(发件人、收件人、金额);
功能
Cairo 1.0 中的函数看起来类似于 0.x 版本,省略了隐式参数,并将 func 关键字更改为遵循 Rust 约定的 fn。下面是 Cairo 1.0 中基本函数签名的示例:
fn balance_of(账户:毛毡)-> u256 { ... }
您还会注意到返回变量不再包含变量名称,而只包含它们的数据类型。
退货单
就像 Rust 一样,Cairo 1.0 中的函数可以通过省略结尾的分号来隐式返回值,如下所示:
#[看法] fn get_name() -> 感觉 { 名称::读取() }
在这种情况下,函数的最终表达式会自动返回,或者通过使用 return 关键字显式返回,如下所示:
#[看法] fn get_name() -> 感觉 { 返回名称::读取(); }
装饰器
装饰器在 Cairo 1.0 中仍然存在,但具有类似于 Rust 宏的新语法。
你可以像这样声明一个装饰器:
#[外部的]
#[看法]
枚举和模式匹配
枚举是一种特殊的数据类型,由您定义的一组固定常量组成。
您可以在 Cairo 1.0 中创建枚举,如下所示:
enum Animals { 山羊:毛毡,狗:毛毡,猫:毛毡 }
Cairo 1.0 还使我们能够使用 match 关键字创建类似于 Rust 的模式匹配。当与枚举相结合时,模式匹配可以让我们根据函数遇到的数据变体来调整函数的行为。
枚举颜色 { 红色:毛毡,绿色:毛毡,蓝色:毛毡 } func get_favorite_color() -> 颜色 { 颜色::绿色(0) } func main() -> 感觉 { 让 my_color = get_favorite_color(); 让结果 = 匹配 my_color { 颜色::红色(_) => { 1个 }, 颜色::绿色(_) => { 2个 }, 颜色::蓝色(_) => { 3个 }, }; 结果 // 返回 2 }
数组
Cairo 1.0 使数组操作变得更加容易,因为除了一些相关函数(如append、array_at和array_len )之外,核心库还导出数组类型。一些基本的数组操作包括向现有数组添加新元素、获取元素索引、获取数组长度等。这些可以从ArrayTrait访问。
fn fib(n: usize) -> (Array::<felt>, felt, usize) { 让 mut arr = ArrayTrait::new(); arr.append(1); arr.append(1); 让 mut arr = fib_inner(:n, :arr); 让 len = arr.len(); 让 last = arr.at(len - 1_usize); 返回(arr,最后,len); }
错误消息和访问控制
您可以在 Cairo 中创建自定义错误,这些错误会在执行失败时输出给用户。这对于实施检查和适当的访问控制机制非常有用。
使用 Cairo 1.0,您可以使用 assert 语句以类似于 Solidity 中的 require 语句的模式轻松地做到这一点:
assert(sender != 0, 'ERC20: transfer from 0');
其中错误信息必须少于 31 个字符。
特征及其实现
Cairo 1.0 引入了特征和实现。将特征视为一种特殊类型的契约接口,因为它们定义了特定类型具有并可以与其他类型共享的功能。它们是使用trait关键字定义的。
特质 IContract{ fn set_something(num: felt, pair: felt); fn get_something(num: felt) -> 感觉; }
另一方面,实现实现了特定的特征行为。特性中的所有函数都必须在实现中定义。
它们是使用impl关键字定义的,如下所示:
IContract 的 impl 合同 { fn set_something(num: felt, pair: felt) { number_pair::write(num, pair) } fn get_something(num: felt) -> 感觉{ number_pair::read(num) } }
泛型
Cairo 1.0 与 Rust 类似,也支持泛型,这使您能够编写灵活的代码,并且可以处理多种类型,而不是绑定到特定类型。
通过使用尖括号 <> 将类型参数指定为泛型,如下所示:
fn foo<T>(arg: T) -> T { …… }
Replace_class 系统
在 Cairo 1.0 和 Starknet v0.11 中,将添加一个新的系统调用,使您能够在不更改合约入口点的情况下交换底层合约实现(类哈希)。想想默认代理!
最好的部分是您只需使用一行代码即可完成此操作:
#[合同] 模组可升级{ 使用 starknet::replace_class; . …… #[外部的] fn 可升级(cls_hash:感觉){ 替换类(cls_hash); } }
结论
恭喜,您刚刚编写并编译了您的第一个 Cairo 1.0 合约,并了解了 Cairo 1.0 的主要功能!
同样,Cairo 1.0 仍在进行中并且发展迅速。每天都会添加新功能,因此请务必查看官方回购和Discord 讨论频道以了解最新信息!
以下是我们认为可以帮助您完成 Cairo 0.10 之旅的一些其他资源:
- Cairo 1.0 初探:更安全、更强大、更简单的可证明编程语言
- Cairo 1.0 — 变化、特性、发布日期
- https://github.com/starkware-libs/cairo/blob/main/docs/reference/src/SUMMARY.adoc
- https://github.com/argentlabs/starknet-build/tree/main/cairo1.0/examples
- StarkWare 的 Cairo 1.0
如果您对此有任何疑问,请联系我@0xdarlington,我很乐意帮助您使用 Argent X 在 Starknet 上进行构建。
如需更多开发人员资源,请关注我们的社交网站:
推特—— @argentHq
工程 Twitter — @argentDeveloper
领英—— @argentHq
Youtube—— @argentHQ
英文原文链接:https://www.argent.xyz/blog/getting-started-with-cairo-1.0/