Cointime

扫码下载App
iOS & Android

一场从Solidity到Cairo的革命性的转变,你是否准备好迈向智能合约开发的未来?

作者:StarkWare. 编译:Cointime.com QDD

摘要:

  • 开发者们正在通过学习Cairo来扩展自己的技能,这是由于Starknet的日益重要。
  • Solidity使得全球可互操作的智能合约成为可能,但需要大量的计算重复。
  • Cairo的高效性源于它使用单一机器创建可验证的交易执行证明的能力。
  • Cairo和Solidity都是智能合约语言,但它们的功能和原则是不同的。

介绍

随着Starknet的增长(以及对Rollups的持续兴趣),Cairo已成为Web3中最受需求的技能之一。

Cairo用于在Starknet和StarkEx上编写智能合约,以及为dYdX和ImmutableX等应用程序提供扩展。过去两年,全职Cairo开发者的数量增长了惊人的875%,年增长率为83%。由于Cairo可以在需要任何计算证明的情况下在区块链之外使用,预计开发者对Cairo的采用只会增加。

其中许多新的Cairo开发者是从Solidity转过来的——Solidity是L1上的智能合约语言。如果你是这些开发者之一,我们将在这篇文章中为你提供从Solidity到Cairo的开发者指南。我们将讨论Cairo的特点,从技术角度介绍Cairo的工作原理,并通过一些代码示例展示两种语言之间的关键差异。

让我们开始吧!

什么是Cairo?

Cairo是为Starknet设计的受Rust启发的本地智能合约语言。

根据Cairo文档的描述,"Cairo是用于创建STARK可证明程序的图灵完备语言"。让我们对这个定义进行解释。

图灵完备意味着这种编程语言可以模拟图灵完备机器。图灵完备机器是一台计算机,如果给予足够的时间和资源,可以执行任何计算和算法。

STARK可证明意味着用Cairo编写的程序可以被执行,从而可以高效地创建一个STARK(可扩展透明知识证明)的执行证明。当用Cairo编写的程序在任何机器上执行时,将创建一个新的STARK证明,使得任何独立验证者可以简明地验证程序的正确执行,而无需信任执行计算的机器。

Cairo 1.0刚刚在今年春季发布(取代了Cairo 0),并已在Starknet Mainnet上提供。

Cairo和Solidity哪个更好?

两者都不是!在某种程度上,这是一种"苹果和橙子"的比较。

Solidity是用于广泛采用的可组合计算的语言,这是一种编程范式,其中不同的系统组件可以同步使用,并通过将不同组件组合成复杂的软件来实现。

Solidity使得智能合约能够紧密相连,原因如下:

  • 公开的字节码,对世界透明
  • 标准的ABI结构(允许与外部智能合约交互)
  • 使用以太坊网络几乎具有100%的活跃度(或可用性)
  • 使用以太坊网络作为执行金融交易的手段
  • 智能合约的全球互操作性,由于所有验证者在网络中都持有共同的EVM副本

尽管Solidity通过成为最广泛采用的智能合约语言取得了众多成就,但Cairo具有一项压倒性的特性:它能够创建可证明的通用计算程序。

这个单一的差异化特性使我们能够从每个计算必须重复数十万次的系统(以太坊网络中的验证者数量)转变为一个新的系统,在该系统中只有一个机器(称为证明者)创建一份正确执行交易的证明,其他网络参与者可以验证该证明。

Cairo虚拟机和以太坊虚拟机之间的差异

为了将Cairo程序的执行高效地转换为STARK证明,Cairo虚拟机与EVM(以太坊虚拟机)之间存在一些关键差异:

1. 内存模型。Cairo虚拟机使用单一写入内存模型。一个内存槽不能被覆盖(与EVM不同)。尽管这可能看起来是一个非常复杂的开销,但Cairo编译器解决了这个问题,并允许在代码中使用可变变量(稍后会详细介绍)。单一写入内存模型使Cairo成为一个更可预测和可验证的系统。每个内存地址只写入一次,并保持其值直到程序执行完成。这意味着计算过程有一个清晰、不变的记录,这在生成STARK证明时非常重要,因为它们依赖于验证计算的正确性。

2. 字段。当我们谈论加密证明时,我们几乎总是指这些证明是针对某个字段中元素的操作而创建的。如我们在关于算术化的文章中讨论的那样,在数学中,一个字段是具有两个二元操作(加法和乘法)的元素集合。它满足一定的公理,如封闭性、结合律、交换律以及存在逆元和单位元。字段的示例包括实数、有理数和复数。字段的元素是任何可证明通用计算的操作对象。在讨论字段时,重要的是注意有些字段是有限的(Cairo使用的字段也是有限的)。在有限字段中,元素的数量是有限的,所有元素都小于字段的最高"阶"。字段的"阶"等于元素可以达到的最大数值加一。此外,所有加法和乘法操作的结果都是一个数字,它们的模是字段的最高阶。因此,例如,在一个阶为6的字段中,3+4的结果是(3+4)mod 6 = 7 mod 6 = 1。Cairo使用的是一个阶为2²⁵¹ + 17 * 2¹⁹² + 1的有限字段。由于在生成证明时,所有元素都需要是字段元素,因此Cairo虚拟机以字段元素为基础进行所有操作,而不是像EVM中使用uint256或uint32的传统系统。但是,可以创建抽象技术来使用更方便的uint256类型(或类似类型)。然而,这些结构需要更多资源(以十位数的顺序增加操作次数)来执行。

3. 继承和多态性。Cairo没有继承和多态性的概念。虽然合约可以通过导入特定的函数和存储变量进行扩展,但是常用的面向对象编程概念需要一些创新思维。

Cairo编译为Sierra

需要注意的一步是,当你编写Cairo智能合约时,它首先会被转换为Sierra代码,然后发布到网络上。Sierra代码是对由Cairo虚拟机解释的原始Cairo汇编(CASM)代码的抽象。将Cairo代码编译为Sierra代码时,会在Cairo代码周围添加一些安全措施,其中最重要的措施是防止DoS攻击的机制。

根据Starknet文档的描述,"每个分布式L2的一个关键特性是,序列化者(sequencer)有权得到他们所做工作的补偿。撤销交易的概念是一个很好的例子:即使用户的交易在执行过程中失败,序列化者应该能够将其包含在一个区块中,并收取直到失败点的执行费用"。

然而,有时候用户可能会编写一行代码或包含一笔交易,证明其执行是不可能的。例如,语句assert 1 == 0是一个有效的Cairo语句;然而,将这个执行包含在加密证明中是不可能的,因为这个语句是错误的,并且它会转换为不可满足的多项式约束。因此,Sierra添加了一个安全层,确保即使不可证明的撤销交易也会被收费。这既减轻了对序列化者的DoS攻击的潜在威胁,也满足了序列化者的经济激励。

比较Cairo和Solidity

现在我们对Cairo的基本类型、函数和结构有了一个概念,让我们将其与Solidity的对应部分进行比较,以了解这两种智能合约语言之间的一些相似之处。(请记住,Cairo也可以用于编写非智能合约代码,用于创建可证明的程序。但这超出了我们当前讨论的范围。)

注意:从此处开始,所有关于Cairo的讨论都涉及Cairo 1。不再推荐使用Cairo 0作为在Starknet上编写智能合约的首选语言。

Cairo类型

以下是Cairo中的一些基本类型的列表:

正如你在上面的列表中所看到的(我们刚刚添加了有符号整数,还有Dict.),从Cairo 1开始,无符号整数已经添加到Cairo中,类似于Solidity中的对应类型。尽管对于序列化者来说,使用整数可能不如直接使用field(元素)高效,但将整数集成到Cairo中有望简化开发者的工作。

除此之外,使用数组的语法非常类似于Rust,逻辑上与Solidity中的数组类似。

Cairo中的函数

Cairo中的函数可以是以下类型:

  • internal(内部)
  • external(外部)
  • view(只读)
  • constructor(构造函数)

默认情况下,所有合约函数都被视为internal(这些函数只能从合约内部调用,与其他语言中的私有函数类似)。

外部函数对外开放,其他智能合约以及账户都可以调用。(欢呼,账户抽象!)

view函数是一种只读函数,只能读取链上的状态。view函数不能修改链的状态。

构造函数是Cairo中函数的另一个属性,用于...智能合约的构造函数!

现在,让我们比较一下Cairo和Solidity之间的函数声明语法:

让我们更详细地看一下一些关键差异:

1. 在Cairo中,声明函数的关键字是fn,而在Solidity中是function。

2. 在Cairo中,在函数关键字之前声明函数类型(#[view]),而在Solidity中的格式不同(请参见上文)。

3. 在Cairo编程语言中,声明返回值的语法涉及使用→符号。另一方面,在Solidity中,使用关键字returns来表示返回值。

Cairo中的模块

Cairo中的模块用于将相关功能分组在一个命名空间中。关键字mod用于定义一个模块,后面跟着模块名称和一个代码块,其中包含函数和其他声明。模块可以导入其他模块并使用其功能。

这类似于其他语言中的库,在Solidity中,模块可以与合约的继承进行比较。

例如,在上面的代码中,导入了starknet和array模块。语法与Solidity中的import语句或使用is关键字的继承有所不同。请注意,use关键字使得导入模块中的所有函数在Cairo中可访问。

Cairo中的数组

在Cairo 1.0中,使用数组变得更加容易,因为可以通过数组模块的导出函数(如append、array_at和array_len)对动态数组进行操作。

示例Cairo智能合约

现在我们已经了解了Cairo中的类型和函数集,让我们来看一个示例Cairo ERC20合约代码。ERC20合约是用于代币的标准模板智能合约,人们可以在链上拥有这些代币。它允许用户将代币相互转移、检查用户的余额,并批准向其他实体转移代币。以下是我们的合约代码:

注意:Cairo 1的语法稍有变化,将在今年晚些时候(2023年)进行更新。请参阅此帖子以了解更多详情。

以上代码基于https://github.com/argentlabs/starknet-build/blob/main/cairo1.0/examples/erc20/ERC20.cairo

让我们详细看一下其中一些最重要的部分。

第1行和第2行初始化并为智能合约命名。

#[contract]

mod ERC20 {

第4行从starknet模块导入get_caller_address函数。get_caller_address()函数返回调用该函数的合约的地址。

use starknet::get_caller_address;

第7到14行定义了一个结构(类似于Solidity中的struct),在代码后面会用到。

第20行和第21行定义了一个名为Transfer的事件,当ERC20代币被转移时触发。事件提供了一种高效的方式来跟踪合约的活动/状态变化,从而允许外部监听者做出相应的反应。

#[event]

fn Transfer(from_: felt, to: felt, value: u256) {}

第36到54行包含了构造函数(合约部署时调用的函数)和一个读取name存储变量并将其值返回给用户的视图函数。

第97到101行定义了一个外部函数(前面已经讨论过),用于将ERC20代币从一个账户转移到另一个账户。该函数在底层调用了transfer_helper()函数,该函数还触发了上面定义的Transfer()事件。

结论

如果你对Solidity感到熟悉,现在你应该已经初步了解了Starknet的工作原理,了解了Cairo和Solidity之间的区别,以及如何阅读基本的Cairo智能合约。

在Cairo开发旅程的下一步,请参考Cairo文档、注册Cairo Basecamp或查看教程

评论

所有评论

推荐阅读

  • Polymarket周一将发布重大公告

    3 月 21 日,Polymarket 团队成员 Mustafa 发文表示,将于周一公布一项「重大公告」,具体内容尚未披露。

  • Polymarket将于下周一公布重大消息,或为发币或融资相关消息

    Cointime 报道,3月21日消息,Polymarket 官方团队成员 Mustafa 于 X 平台发文表示,下周一即将公布重大消息。因推文内容包含硬币符号,社区猜测或为融资或代币发射相关重大消息。 此前消息,预测市场平台 Kalshi 与 Polymarket 据悉正与潜在投资者洽谈新一轮融资,目标估值均约为 200 亿美元。日前,Kalshi 已完成新一轮超 10 亿美元融资,估值达 220 亿美元,较去年 12 月上一轮融资时的 110 亿美元估值翻倍。知情人士透露,本轮融资由 Coatue Management 领投,Kalshi 目前的年化收入为 15 亿美元。

  • 美众议院金融服务委员会将于3月25日举行代币化听证会,聚焦资本市场未来

    3 月 21 日,美国众议院金融服务委员会将于美东时间 3 月 25 日 10:00 举行听证会,主题为「代币化与资本市场的未来」,预计将重点讨论区块链技术在金融体系中的应用与监管方向。

  • 黄金创43年来最大周跌幅:一周暴跌11%,避险属性遭质疑

    3 月 21 日,受中东局势升级及利率预期影响,黄金价格大幅下挫,创下自 1983 年以来最大单周跌幅。现货黄金周五跌至约 4488 美元/盎司,单周累计下跌约 11%,自 2 月底以来累计跌幅已超 15%。市场分析认为,美联储年内或维持利率不变、鲍威尔关于通胀上行的表态削弱了黄金吸引力。同时,在伊朗冲突背景下,比特币表现相对更强,期间反弹超 11%,对黄金形成对比。

  • 分析:加密市场山寨币交易量大幅下滑,市场兴趣持续降温

    3 月 21 日,Cryptoquant 分析师 Darkfost 发文称,加密市场山寨币交易量持续走低,投资者兴趣明显减弱。在熊市背景及地缘政治不确定性影响下,山寨币表现持续跑输比特币,风险偏好显著收缩。当前,Binance 山寨币日交易量约为 77 亿美元,其它主要交易所合计约 188 亿美元,远低于 2025 年 10 月与 2 月高峰期(Binance 曾达 400 亿至 500 亿美元,其它平台达 630 亿至 910 亿美元)。目前 Binance 占据约 40% 的市场份额。分析指出,历史上交易量高峰往往对应市场阶段性顶部与 FOMO 情绪释放,而当前低迷成交环境也意味着潜在机会通常出现在市场关注度最低阶段。

  • 消息人士:特朗普政府正制定方案以夺取伊朗核材料储备

    3 月 21 日,据美国哥伦比亚广播公司(CBS)报道,多位知情人士透露,特朗普政府一直在谋划获取或转移伊朗核材料的方法和选项。此时,由美国和以色列领导的针对伊朗的军事行动正进入一个更加不确定的阶段。关于特朗普是否会下令实施此类行动,目前时机尚不明确。一位消息人士表示,他尚未做出任何决定。但两位消息人士表示,相关规划的核心是可能部署来自联合特种作战司令部的部队,该部队是精英军事单位,常负责最敏感的防扩散任务。

  • 中东冲突与加息预期共振:全球资产大震荡,美股四连跌、债市「血洗」、黄金创43年最大周跌幅

    3 月 21 日,中东局势持续升级叠加 Federal Reserve 加息预期骤然升温,全球市场遭遇系统性冲击。美股连续第四周下跌创一年最长跌势,纳指单日跌超 2%,科技股全线承压;全球债市收益率大幅飙升,美债、英债、德债均创多年新高,资金大规模去杠杆。大宗商品剧烈分化,黄金跌破 4500 美元关口,单周暴跌超 10%,创 1983 年以来最大跌幅,避险属性遭质疑;原油则因中东供应风险暴涨,布油重返 110 美元上方,迪拜原油期货单日飙升超 16%。与此同时,比特币在 7 万美元附近获得支撑,连续三周跑赢黄金。市场分析认为,地缘冲突推升能源价格并加剧通胀预期,迫使货币政策路径重定价,全球金融条件快速收紧,风险资产仍处于下行与再定价过程中。

  • 美团开源560B参数定理证明模型:72次推理通过率97.1%,刷新开源模型SOTA

    据 1M AI News 监测,美团 LongCat 团队开源 LongCat-Flash-Prover,一个 5600 亿参数的 MoE 模型,专攻形式化定理证明语言 Lean4 的数学推理任务。模型权重以 MIT 协议发布,已上线 GitHub、Hugging Face 和 ModelScope。模型将形式化推理拆解为三项独立能力:自动形式化(将自然语言数学问题转化为 Lean4 形式语句)、草图生成(产出引理风格的证明框架)和完整证明生成。三项能力均通过 Agent 工具集成推理(TIR)与 Lean4 编译器实时交互验证。训练方面,团队提出 Hybrid-Experts Iteration Framework 生成冷启动数据,并在强化学习阶段引入 HisPO 算法稳定 MoE 模型的长程任务训练,同时加入定理一致性和合法性检测机制防止 reward hacking。基准测试显示,LongCat-Flash-Prover 在开源权重模型中刷新了自动形式化和定理证明两项 SOTA。MiniF2F-Test 上仅用 72 次推理即达 97.1% 通过率,ProverBench 和 PutnamBench 分别达到 70.8% 和 41.5%,每题推理次数不超过 220 次。

  • Erik Voorhees再次增持1.44万枚ETH,总持仓量突破11.7万枚

    3 月 21 日,据 AI 姨监测,ShapeShift 创始人、比特币早期支持者 Erik Voorhees 关联地址,过去 11 小时买入 14,424.53 ETH,总持仓突破 11.7 万枚,持仓均价 2,160.24 美元,当前浮亏 114.5 万美元。

  • 消息人士:特朗普政府正制定方案以夺取伊朗核材料储备

    Cointime 报道,3月21日消息,据美国哥伦比亚广播公司(CBS)报道,多位知情人士透露,特朗普政府一直在谋划获取或转移伊朗核材料的方法和选项。此时,由美国和以色列领导的针对伊朗的军事行动正进入一个更加不确定的阶段。 关于特朗普是否会下令实施此类行动,目前时机尚不明确。一位消息人士表示,他尚未做出任何决定。但两位消息人士表示,相关规划的核心是可能部署来自联合特种作战司令部的部队,该部队是精英军事单位,常负责最敏感的防扩散任务。(金十)