Cairo1.0 入门

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

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

去年 9 月,StarkWare 发布了两项重大公告,将显着改善网络上的开发人员体验。 

他们是:

  1. Cairo 1.0:对 Starknet 的本地编程语言 Cairo 的巨大升级,它承诺为 Starknet 开发人员提供更安全、更简单和更好的编程体验。 
  2. 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 合约。  

设置您的 Cairo 0.1 开发环境

我们所有的合同都将进入 src 文件夹。我们已经创建了一个样板合同,我们将在本文的下一部分将其编译为sierracasm 。

一旦我们克隆了 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",
成功设置您的 Cairo 0.1 开发环境

如果安装成功,请前往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,编译我们的合约将分两个阶段进行:

  1. 开罗 > 塞拉利昂
  2. 塞拉利昂 > 卡斯姆

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 使数组操作变得更加容易,因为除了一些相关函数(如appendarray_atarray_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 之旅的一些其他资源:

  1. Cairo 1.0 初探:更安全、更强大、更简单的可证明编程语言
  2. Cairo 1.0 — 变化、特性、发布日期
  3. https://github.com/starkware-libs/cairo/blob/main/docs/reference/src/SUMMARY.adoc
  4. https://github.com/argentlabs/starknet-build/tree/main/cairo1.0/examples
  5. 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/

所有文章项目介绍

Index Coop 引入多元化质押

2023-2-8 12:57:00

所有文章项目介绍

通过 Deploy & Execute Launch 实现关键里程碑

2023-2-24 10:27:02

搜索