CAIRO:Cairo 1.0 的内部机制:探索 Sierra

译者导读

Cairo是一个图灵完备的ZK友好高级语言,也是以太坊L2-Starknet的合约开发语言,它正在进行改版升级。本篇文章是分析Cairo1.0系列文章的第一篇,作者?Mathieu?分析了Sierra作为Cairo高级语言到Cairo汇编的中间层的设计动机与实现原理。文中提到了大量Cairo0存在问题、Cairo1改进之处,并附有丰富的代码细节,推荐Cairo开发者阅读全文以深入了解Cairo1.0。

TL;DR

Sierra在高级Cairo编程语言与更原始的编译目标之间担任了重要的中间人角色,确保生成的CASM可在Starknet上安全运行。它的设计以安全为中心,使用一组函数来生成安全的CASM代码,结合强大的编译器和线性类型系统来防止运行时错误,以及内置Gas系统来防止无限循环。在接下来的部分,我们将专注于理解Sierra程序的结构,提供了阅读和理解Sierra程序所需的基本要求。

简介

我最近参加了StarkwareSessions的两场会议,分别是ShaharPapini的“EnforcingSafetyUsingTypesystems”和OriZiv的“NotStoppingattheHaltingProblem”。如果你想了解更多有关Cairo堆栈的信息,我强烈建议你观看这些视频。以下文章是一个系列的第一篇,我将深入了解Sierra以更好地理解Cairo、其机制以及整个Starknet。

Sierra是高级语言Cairo和诸如CairoAssembly之类的编译目标之间的中间层。该语言旨在确保安全并防止运行时错误。它使用编译器检测可能在编译时失败的操作,以确保每个函数都返回并且没有无限循环。Sierra使用简单但强大的类型系统来表达中间层代码,同时确保安全性。这使得可以有效地编译成CASM。

LeetSwap:部分流动性池或已受到攻击,已暂停交易:8月1日消息,据 LeetSwap 官方消息,该平台部分流动性池或已受到攻击,已暂停交易。[2023/8/1 16:10:36]

动机

在Cairo0中,开发人员会使用Cairo编写Starknet合约,将其编译为CASM,并直接部署编译输出到Starknet上。用户可以通过调用智能合约函数、签署交易并将其发送给排序器来与Starknet合约交互。排序器将运行交易以获取用户的交易费用,证明者将为包括此交易的批次生成ZK证明,排序器将收取包括交易在内的交易费用。

Cairo0交易流程

然而,该Cairo0流程会产生一些问题:

在Cairo中只有有效的语句才能被证明,所以无法证明失败的交易。无法证明无效的语句,例如?assert0=1,因为它转换为无法满足的多项式约束。交易执行可能会失败,导致交易未被包括在块中。在这种情况下,排序器会做无偿的工作。由于失败的交易没有有效的证明,它们不能被包括在内,也没有办法强制排序器收费。排序器可能被DDoS攻击,攻击者使用无效交易使其白干一场,而排序器无法收取运行这些交易的任何费用。无法区分审查制度censorship和无效交易,因为这两种类型的交易都不会被包括在块中。在以太坊上,所有失败的交易都被标记为?reverted,但仍包括在块中,允许验证者在失败时收取交易费用。为了防止恶意用户用无效交易轰击网络并使排序器不堪重负,从而使合法交易无法处理,Starknet需要一个类似的系统,允许排序器收取失败交易的费用。为了解决上述问题,Starknet网络需要实现两个目标:完整性和有效性。完整性确保交易执行始终可以被证明,即使它预计会失败。有效性确保不会拒绝有效交易,从而防止审查制度。

Polygon联合创始人推出web3创业加速器Beacon:金色财经报道,Polygon和Symbolic Capital联合创始人Sandeep Nailwal推出了一个 web3 创业加速器。Nailwal表示,已有 15 家初创公司获得了 Beacon 的资助。他拒绝透露这些初创公司的名称,称它们将在 1 月份公布。[2022/12/21 21:57:08]

Sierra是构造正确的,让排序器为所有交易收费。我们可以部署分支代码,而不是可能失败的代码。Cairo1的asserts被翻译成分支Sierra代码,允许错误传播回返回布尔值的原始入口点,表示交易成功或失败。如果入口点返回值为true/false,则Starknet操作系统可以确定交易是否有效,并决定是否应用状态更新,如果交易成功。

Cairo1提供类似于Rust的语法,并通过抽象Sierra的安全构造来创建可证明的、开发人员友好的编程语言。它编译为Sierra,这是Cairo代码的构造正确的中间表示,不包含任何失败语义。这确保了没有Sierra代码会失败,并且它最终编译为CASM的安全子集。开发人员可以专注于编写高效的智能合约,而不必担心编写非失败的代码,所有这些都具有改进的安全原语。

开发人员将会将他们的Cairo1代码编译为Sierra,并将Sierra程序部署到Starknet上,而不是将CASM代码部署到Starknet上。在声明交易时,排序器将负责将Sierra代码编译为CASM,以确保不能在Starknet上部署失败的代码。

构造正确

为了设计一个不会失败的语言,我们必须首先确定Cairo0中的不安全操作。包括:

Telegram钱包机器人现支持在应用聊天界面直接交易TON代币:11月28日消息,由于最近Telegram钱包机器人

由于递归函数如果停止条件永远不满足就可能导致无限循环,因此Cairo-to-Sierra编译器将在递归函数开头注入?withdraw_gas方法。由于该功能尚未实现,因此开发人员仍需要在递归函数中调用?withdraw_gas并自行处理结果,尽管在未来版本中应该会包含在编译器中。

该?withdraw_gas?函数将通过计算函数中每条指令的运行成本来从交易总可用Gas中扣除运行函数所需的Gas数量。成本是通过确定每个操作需要多少步来分析的,大多数操作的步在编译时是已知的。在Cairo程序执行期间,如果?withdraw_gas?调用返回null或负值,则当前函数执行会停止,所有待处理的变量都将通过对未压缩字典调用?dict_squash?和对其他变量调用?drop?来消耗,并将被认为是执行失败。由于Starknet上的所有交易都有一个有限的可用Gas量来执行交易,因此避免了无限循环,并通过确保仍有足够的Gas可用来删除变量并停止执行,排序器将能够从事务失败中收取费用。

通过一组有限的指令实现安全的CASM

Sierra的主要目标是确保生成的CASM代码不会失败。为实现这一目标,Sierra程序由调用?libfuncs?的语句组成。这些是一组内置库函数,为这些函数生成的CASM代码是保证安全的。例如,array_append?库函数生成的安全CASM代码可用于将值附加到数组中。

通过仅允许一组安全和可信赖的库函数来实现代码安全的这种方法类似于Rust编程语言的哲学。通过提供一组安全和可信赖的抽象,这两种语言都有助于避免常见的编程错误,并增加代码的安全性和可靠性。Cairo1使用了与Rust类似的所有权和借用系统,为开发人员提供了一种在编译时推理代码安全性的方式,这有助于防止错误并提高整体代码质量。

免责声明

本文旨在为读者提供通用信息和理解,不表示Nethermind支持任何特定资产、项目或团队,也不保证其安全性。Nethermind没有明示或暗示地向本文中包含的信息或观点的准确性或完整性作出任何陈述或保证。任何第三方不得以任何方式依赖本文,包括但不限于金融、投资、税收、监管、法律或其他建议,或将本文解释为任何形式的建议。请注意,虽然Nethermind为Starkware提供服务,但本文不是这些服务的一部分。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金星链

PEPE币LSD:长推:LSD与 LSDFi

注:本文来自@Wayne24699837推特,MarsBit整理如下:LSD与LSDFi长推:本周更新版LSDFiMAPProvider端:如我们所说.

[0:46ms0-1:370ms