Cairo 1.0 开源啦

Cairo 1.0 开源

https://medium.com/starkware/open-sourcing-cairo-1-0-b3100a664bb0

Cairo 1.0 开源啦

  • 开罗 1.0 是开源的!这只是 StarkNet 堆栈开源的第一步。
  • 我们现在介绍一下 Cairo 1.0 编译器。您现在可以开始使用基本的 Cairo 1.0 代码进行试验
  • Cairo 1.0 的核心与 Rust 非常相似。
  • 将其视为初体验,而不是发布。更多改进正在进行中。编译器的第一个版本计划于明年第一季度初发布。
  • StarkNet 尚不支持 Cairo 1.0。它将在明年第一季度在 StarkNet 上得到支持。

介绍

2020年,我们发布了Cairo,一种支持可验证计算的图灵完整编程语言。Cairo最初是一种汇编语言,后来逐渐变得更有表达力。两个月前,我们宣布了Cairo 1.0,它解决了目前情况下的一些主要问题。

  • 虽然Cairo的语法自诞生以来已经有了很大的改进,但开发者的体验总是可以改进的。Cairo 1.0是一种受rust启发的完全类型化的语言,使得编写相同的逻辑更容易,更少出错。
  • 现有的编译器与StarkNet本身是在同一个repo中开发的,这使得跟踪语言变化变得更加困难。Cairo 1.0编译器是从头开始编写的,允许更快的功能开发和更多的社区参与。
  • 每个计算现在都是可证明的。目前,一个Cairo程序在特定的输入下可能会失败(例如在某些计算分支中达到 "断言1=2 "指令),从而使计算无法被证明。在Cairo 1.0中,程序在每个可能的分支中都是可证明的。这对StarkNet中的DOS保护和抗审查特别重要。

今天,我们标志着实现上述目标的第一个里程碑,我们将开发工作转移到一个公共仓库,并开放了Cairo 1.0的源代码!开发者现在可以第一次编译和执行简单的Cairo 1.0程序。这使得开发者可以开始尝试使用Cairo 1.0,并逐渐习惯于新的功能,即使在这个阶段,他们还不能在StarkNet上实现它。

当前能力

目前,你可以编译和执行基本的原生Cairo程序。虽然许多语法/语言的改进仍在进行中,但这可以让你习惯于Cairo 1.0,并享受它们带来的升级。

请注意,编写StarkNet合约仍然是不支持的。StarkNet的语法(storagevariables/调用合约/事件和其他系统调用)将在未来几周添加。

Code Examples

为了说明旧的语法和Cairo 1.0之间的差异,我们选择了几个不同的实现/风格来寻找第n个斐波那契数。

Example I: match 表达式

在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),
    }
}

Example II: Data 类型

当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)
}

Example III: structs and ownership

下面的代码展示了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的原始(非确定性只读)内存模型。

Example IV: 错误传递

下面的代码计算了第n个斐波那契数,但与之前的例子不同,所有的输入都是uint128类型。请注意,这解决了在Cairo 0中处理uint的一个主要痛点。在这里,uint128(以及将来的uint256)是一种类型。

![[Pasted image 20221125102324.png]]

两个128位的整数相加会导致溢出。上面的代码使用Option枚举和问号操作符来处理中间加法中的溢出情况。与目前的uint256加法语法相比,必须调用 "unit256_check "函数来保证健全性。此外,在不久的将来,我们将在语言中加入 "panic "的概念(类似于rust中的panicmacro),像添加溢出这样的简单错误将是不可捕捉的,并自动传播,这意味着你在添加uint时不必使用Option?

Try it yourself

你现在可以编译和运行目前支持的Cairo 1.0程序了!请按照以下说明使用cairo-run命令。请注意,在本例中,由Lambdaclass开发的Rust Cairo虚拟机被用于执行。

你可以在这里找到更多的例子来帮助你入门。请注意,这只是对编译器开发的初步了解;在未来几周内,我们将在编译器的同时改进CLI。

Future Plans 

第一版编译器的重点是支持Cairo 1.0中StarkNet的现有功能,计划在第一季度初推出。此外,我们正在努力扩展Cairo 1.0编译器的功能。在未来几周内,你可以期待。

  • StarkNet的能力--编写智能合约和使用系统调用.
  • 循环
  • 新的库函数
  • 改进的语言服务器
  • StarkNet gas的本地实现

请务必保持关注并跟踪编译器的进度

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Cairo Phoenix
Cairo Phoenix
江湖只有他的大名,没有他的介绍。