原文:Open Sourcing Cairo 1.0!
作者:StarkWare
翻译:「StarkNet 中文」社区
Cairo 1.0 开源啦!这还仅仅只是开源 StarkNet 堆栈的第一步
现公开 Cairo 1.0 编译器的预览版,可以尝试基本的 Cairo 1.0 代码了
Cairo 1.0 核心和 Rust 非常类似
这只是预览版本,并不是正式发布。还有更多改进正在进行中,第一版编译器预计在明年第一季度上线
Cairo 1.0 现不支持 StarkNet,但将在明年第一季度实现 StarkNet 支持
在 2020 年,我们发布了支持可验证计算的图灵完备编程语言 Cairo。Cairo 最初作为一种汇编语言,随着不断的开发变得极具表现力。两个月前,我们曾公开表示 Cairo 1.0 解决了当前形势中一些重要问题:
虽然 Cairo 的语法相比初阶段已经有了显著的改进,但开发者体验仍可以不断改善。Cairo 1.0 作为受 Rust 启发的全类型语言,便于编写相同的逻辑和减低出错概率。
现有的编译器与 StarkNet 的开发同属一个 Repo,难以追踪其语言更改。而 Cairo 1.0 编译器重新编写,允许更快捷的开发功能和更多社区参与。
现在每一次计算都是可证明的。目前,Cairo 程序可能在特定的输入指令时失败(如在某些计算分支中得到 assert 1=2
指令),导致无法证明计算。在 Cario 1.0 中,程序在每一个分支都是可证明的,这对于 StarkNet 中的 DOS 保护是至关重要的。
今天,我们实现了上述目标中的第一个里程碑,将开发转移至公共 Repo 并开源 Cairo 1.0!尽管现阶段还无法在 StarkNet 部署,开发者们可以尝试使用 Cairo 1.0 和体验新功能。
现在可以编译和执行基础的原生 Cairo 程序。尽管很多语法/语言仍在改进,但可以先熟悉 Cairo 1.0,感受未来升级的乐趣。
请注意,暂不支持编写 StarkNet 合约。StarkNet 语法(存储变量/调用合约/事件和其他系统调用)将在未来几周添加。
为展示旧版语法和 Cairo 1.0 之间的差异,我们在下面展示了找到第 n 个斐波那契数的几种不同实现/偏好。
在 Cairo 1.0 中,你可以使用类似 rust 的匹配表达式。再也不用怕可能导致引用撤销的 if/else 命题了!
Cairo 0 中使用 felt 和指针,而在 Cairo 1.0 中我们有复杂数据类型的原生访问形式了。在下面你可以看到生成前 n 个斐波那契数列的示例。
在上图可见,不再是直接用内存指针,而是使用 Array::<felt>
类型和 array_append
函数。
以下代码说明了 Cairo 1.0 中结构的用法。
以下内容仅针对 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)都是原生数据类型。
两个 128 位的整数相加会导致溢出。以上代码使用了 Option 枚举和问号运算符来处理其中一个中间加法运算的溢出情况。而目前的 uint256 加法语法,必须调用 uint256_check
来保证可靠性。另外,我们未来将添加 panic 概念(与 Rust 中的 panic 宏类似),并且加法溢出等简单错误将无法匹配并自动传播,也就意味着在相加 uint 时不必使用Option
或?
了。
现在来自己动手尝试编译和运行当前所支持的 Cairo 1.0 程序吧。按照说明教程,学会 cairo-run
指令。请注意后台将由 Lambdaclass 开发的 Rust Cairo VM 执行指令。
点击查看入门示例,请注意这只是编译器开发的预览版本,我们将会在几周内改进编译器以及 CLI。
编译器的第一个版本将着重支持 Cairo 1.0 中 StarkNet 的所有现存功能,该版本计划于明年第一季度推出。除此之外,我们正在扩展 Cairo 1.0 编译器性能。将在几周内上线:
StarkNet 性能:编写智能合约系统调用功能
循环
全新库函数
改进语言服务器
原生 StarkNet Gas 概念
敬请关注编译器最新进展!