# 如何使用Cairo编程语言

By [dapaopao](https://paragraph.com/@dapaopao) · 2023-11-01

---

**Cairo是什么**

Cairo 是一种为同名虚拟 CPU 设计的编程语言。该处理器的独特之处在于，它不是为了我们世界的物理限制而创建的，而是为了加密限制而创建的，使其能够有效地证明在其上运行的任何程序的执行情况。这意味着您可以在不信任的机器上执行耗时的操作，并在更便宜的机器上非常快速地检查结果。虽然 Cairo 0 过去直接编译为 CASM（Cairo CPU 汇编），但 Cairo 1 是一种更高级的语言。它首先编译为 Sierra，这是 Cairo 的中间表示，稍后将编译为 CASM 的安全子集。Sierra 的目的是确保即使计算失败，您的 CASM 也始终是可证明的。

Cairo 允许您在不受信任的机器上计算可信值。Starknet 是一个主要用例，它是以太坊扩展的一种解决方案。以太坊是一个去中心化的区块链平台，可以创建去中心化的应用程序，其中用户和 d-app 之间的每一次交互都经过所有参与者的验证。Starknet 是构建在以太坊之上的第 2 层。不是让网络的所有参与者验证所有用户交互，而是只有一个称为证明者的节点执行程序并生成计算正确完成的证明。然后，这些证明由以太坊智能合约进行验证，与执行交互本身相比，所需的计算能力要少得多。这种方法可以提高吞吐量并降低交易成本，同时保持以太坊的安全性。

Cairo 与传统的编程语言有很大不同，特别是在管理成本及其主要优势方面。您的程序可以通过两种不同的方式执行：

*   当由证明者执行时，它与任何其他语言类似。由于 Cairo 是虚拟化的，并且操作并不是专门为实现最高效率而设计的，因此这可能会导致一些性能开销，但这不是最需要优化的部分。
    
*   当生成的证明由验证者验证时，情况有点不同。这必须尽可能便宜，因为它可以在许多非常小的机器上进行验证。幸运的是，验证比计算更快，开罗拥有一些独特的优势来进一步改进它。一个值得注意的问题是非决定论。这是您将在本书后面更详细介绍的主题，但其想法是，理论上您可以使用与计算不同的算法来进行验证。目前，开发人员不支持编写自定义非确定性代码，但标准库利用非确定性来提高性能。例如，在开罗对数组进行排序的成本与复制数组的成本相同。因为验证器不会对数组进行排序，它只是检查它是否已排序，这样更便宜。
    

该语言与众不同的另一个方面是它的内存模型。在开罗，内存访问是不可变的，这意味着一旦将值写入内存，就无法更改。Cairo 1 提供了抽象来帮助开发人员处理这些约束，但它并没有完全模拟可变性。因此，开发人员必须仔细考虑如何管理程序中的内存和数据结构以优化性能。

**  
环境安装**

要想使用Cairo，需要安装Scarb。

Scarb 是Cairo包管理器。Scarb 下载 Cairo 包的依赖项，编译您的项目（纯 Cairo 或 StarkNet 合约），并作为其他工具（例如Starknet Foundry或 IDE）处理您的代码的入口点。 Scarb 很大程度上受到Cargo的启发。目标是让习惯编写 Rust 的程序员有宾至如归的感觉。

在终端中运行以下命令，然后按照屏幕上的说明进行操作即可。这将安装最新的稳定版本。

    curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh
    

通过在新的终端会话中运行以下命令来验证安装，它应该打印 Scarb 和 Cairo 语言版本，例如：

    $ scarb --version
    scarb 2.3.0-rc1 (58cc88efb 2023-08-23)
    cairo: 2.2.0 (https://crates.io/crates/cairo-lang-compiler/2.2.0)
    sierra: 1.3.0
    

**安装 VSCode 扩展**

Cairo 有一个 VSCode 扩展，它提供语法突出显示、代码完成和其他有用的功能。[您可以从VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=starkware.cairo1)安装它。安装后，进入扩展设置，并确保勾选`Enable Language Server`和`Enable Scarb`选项。

![](https://storage.googleapis.com/papyrus_images/4ac89c816fb148b92ad1b56619febc8319b65c05bf47bd9cc279e356798fe44d.png)

**编写第一个程序**

安装完成后来尝试写第一个程序

您将首先创建一个目录来存储您的开罗代码。对于 Cairo 来说，你的代码所在的位置并不重要，但对于本书中的练习和项目，我们建议在你的主目录中创建一个_cairo\_projects_目录，并将所有项目保存在那里。

打开终端并输入以下命令来创建_cairo\_projects_目录和“Hello, world!”目录 _cairo\_projects_目录中的项目。

对于 Linux、macOS 和 Windows 上的 PowerShell，请输入：

    mkdir ~/cairo_projects
    cd ~/cairo_projects
    

对于 Windows CMD，请输入：

    > mkdir "%USERPROFILE%\cairo_projects"
    > cd /d "%USERPROFILE%\cairo_projects"
    

使用Scarb创建项目

导航到您的项目目录（或您决定存储代码的任何位置）。然后运行以下命令：

    scarb new hello_world
    

它创建一个名为 的新目录和项目`hello_world`。我们将项目命名为`hello_world`，Scarb 在同名目录中创建其文件。

`hello_world`使用命令进入目录`cd hello_world`。你会看到Scarb为我们生成了两个文件和一个目录：一个`Scarb.toml`文件和一个src目录，`lib.cairo`里面有一个文件。

它还初始化了一个新的 Git 存储库以及一个`.gitignore`文件

在您选择的文本编辑器中打开\*Scarb.toml 。\*它应该类似于如下代码。

文件名: Scarb.toml

    [package]
    name = "hello_world"
    version = "0.1.0"
    
    # See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest
    
    [dependencies]
    # foo = { path = "vendor/foo" }
    

第一行`[package]`是节标题，指示以下语句正在配置包。当我们向该文件添加更多信息时，我们将添加其他部分。

接下来的两行设置 Scarb 编译程序所需的配置信息：要使用的 Scarb 的名称和版本。

最后一行`[dependencies]`是一个部分的开始，您可以在此列出项目的任何依赖项。在开罗，代码包被称为 crate。这个项目我们不需要任何其他板条箱。

Scarb创建的另一个文件是`src/lib.cairo`，我们删除所有内容并放入以下内容，稍后我们会解释原因。

    mod hello_world;
    

然后创建一个名为的新文件`src/hello_world.cairo`并将以下代码放入其中：

文件名：src/hello\_world.cairo

    use debug::PrintTrait;
    fn main() {
        'Hello, World!'.print();
    }
    

我们刚刚创建了一个名为 的文件`lib.cairo`，其中包含引用另一个名为 的模块的模块声明`hello_world`，以及`hello_world.cairo`包含该模块的实现细节的文件`hello_world`。

Scarb 要求您的源文件位于该`src`目录中。

项目目录保留用于自述文件、许可证信息、配置文件和任何其他非代码相关内容。Scarb 确保所有项目组件都有一个指定的位置，从而维持结构化的组织。

如果您启动的项目不使用 Scarb，则可以将其转换为使用 Scarb 的项目。将项目代码移至 src 目录并创建适当的`Scarb.toml`文件。

build Scarb项目

从您的`hello_world`目录中，输入以下命令来构建您的项目：

    $ scarb build
       Compiling hello_world v0.1.0 (file:///projects/Scarb.toml)
        Finished release target(s) in 0 seconds
    

该命令`sierra`在 中创建一个文件`target/dev`，我们`sierra`暂时忽略该文件。

如果您已正确安装 Cairo，您应该能够运行并看到以下输出：

    $ scarb cairo-run
    running hello_world ...
    [DEBUG] Hello, World!                   (raw: 0x48656c6c6f2c20776f726c6421
    
    Run completed successfully, returning []
    

无论您使用哪种操作系统，该字符串`Hello, world!`都应该打印到终端。

如果`Hello, world!`打印出来了，恭喜！您已经正式编写了 Cairo 程序。

---

*Originally published on [dapaopao](https://paragraph.com/@dapaopao/cairo)*
