Cairo 1.0 开源
https://medium.com/starkware/open-sourcing-cairo-1-0-b3100a664bb0
2020年,我们发布了Cairo,一种支持可验证计算的图灵完整编程语言。Cairo最初是一种汇编语言,后来逐渐变得更有表达力。两个月前,我们宣布了Cairo 1.0,它解决了目前情况下的一些主要问题。
今天,我们标志着实现上述目标的第一个里程碑,我们将开发工作转移到一个公共仓库,并开放了Cairo 1.0的源代码!开发者现在可以第一次编译和执行简单的Cairo 1.0程序。这使得开发者可以开始尝试使用Cairo 1.0,并逐渐习惯于新的功能,即使在这个阶段,他们还不能在StarkNet上实现它。
目前,你可以编译和执行基本的原生Cairo程序。虽然许多语法/语言的改进仍在进行中,但这可以让你习惯于Cairo 1.0,并享受它们带来的升级。
请注意,编写StarkNet合约仍然是不支持的。StarkNet的语法(storagevariables/调用合约/事件和其他系统调用)将在未来几周添加。
为了说明旧的语法和Cairo 1.0之间的差异,我们选择了几个不同的实现/风格来寻找第n个斐波那契数。
在Cairo 1.0中,你可以使用类似Rust的match expressions。你再也不用担心if/else statement可能导致reference revocation了!
// Calculates fib...
func fib(a: felt, b: felt, n: felt) -> felt {
match n {
0 => a,
_ => fib(b, a + b, n - 1),
}
}
当Cairo 0使用felt和指针时,在Cairo 1.0中,我们有了对语言中复杂数据类型的原生访问。下面你可以找到一个例子,它生成了一个前n个斐波那契数的数组。
// Returns an array of size n with the values of the Fibonacci sequence
func fib(n: felt) -> Array::<felt> {
fib_inner(1, 1, n, array_new::<felt>())
}
func fib_inner(a: felt, b: felt, remaining: felt, arr: Array::<felt>) -> Array::<felt> {
if remaining == 0{
return arr;
}
let arr = array_append::<felt>(arr, a);
fib_inner(b, a+b, remaining - 1, arr)
}
下面的代码展示了Cairo 1.0中结构的使用情况。
![[Pasted image 20221125102126.png]]
下面这段话是为Rust观众准备的。Cairo 1.0以类似于Rust的方式管理内存。因此,通过访问
FibResult
结构的一个成员(在本例中,result.value
),我们已经移动了result
,这意味着除非FibResult是可复制的,否则我们不能在result.index
中再次访问它。为了克服这个问题,我们在 "FibResult "类型中添加了 "#[derive(Copy)]"属性。在未来的版本中,我们将为结构添加自动解构功能。这将允许在不影响其他成员的情况下移动一个成员的所有权(特别是,即使FibResult
没有复制属性,上面的代码也会被编译)。
特别要注意的是,Cairo 1.0完全抽象了Cairo的原始(非确定性只读)内存模型。
下面的代码计算了第n个斐波那契数,但与之前的例子不同,所有的输入都是uint128类型。请注意,这解决了在Cairo 0中处理uint的一个主要痛点。在这里,uint128(以及将来的uint256)是一种类型。
![[Pasted image 20221125102324.png]]
两个128位的整数相加会导致溢出。上面的代码使用Option枚举和问号操作符来处理中间加法中的溢出情况。与目前的uint256加法语法相比,必须调用 "unit256_check "函数来保证健全性。此外,在不久的将来,我们将在语言中加入 "panic "的概念(类似于rust中的panicmacro),像添加溢出这样的简单错误将是不可捕捉的,并自动传播,这意味着你在添加uint时不必使用Option
或?
。
你现在可以编译和运行目前支持的Cairo 1.0程序了!请按照以下说明使用cairo-run
命令。请注意,在本例中,由Lambdaclass开发的Rust Cairo虚拟机被用于执行。
你可以在这里找到更多的例子来帮助你入门。请注意,这只是对编译器开发的初步了解;在未来几周内,我们将在编译器的同时改进CLI。
第一版编译器的重点是支持Cairo 1.0中StarkNet的现有功能,计划在第一季度初推出。此外,我们正在努力扩展Cairo 1.0编译器的功能。在未来几周内,你可以期待。
请务必保持关注并跟踪编译器的进度
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!