Hello, World

现在你已经通过Scarb安装了Cairo,是时候编写你的第一个Cairo程序了。 在学习一门新语言时,传统的做法是写一个小程序 将文字Hello, world!打印到屏幕上,所以我们在这里也要这样做!

注意:本书假定对你命令行有基本的了解。Cairo对 对你用什么编辑代码或使用什么开发工具或把你的代码放在哪没有特殊要求,所以 如果你喜欢使用集成开发环境(IDE)而不是 命令行,你完全可以使用你喜欢的IDE。Cairo团队已经开发了 Cairo语言的VSCode扩展,你可以用它来获得来自 语言服务器和代码高亮。参见附录D来获取更多细节。

创建一个项目目录

你首先要做一个目录来存储你的Cairo代码。对于Cairo来说,你的代码放在哪里并不重要。 但对于本书中的练习和项目来说,我们建议在你的主目录下建立一个 cairo_projects 目录,并将你的所有项目存放在这里。

打开一个终端,输入以下命令,建立一个 cairo_projects 目录 并在 cairo_projects 目录下为 "Hello, world!"项目建立一个目录。

注意:从现在起,对于书中显示的每个示例,我们都假定 你都是在 Scarb 项目目录中进行编码。如果您没有使用 Scarb,并试图从其他目录运行示例,可能需要相应调整命令或创建一个 Scarb 项目。

对于Linux、macOS和Windows上的PowerShell,输入:

mkdir ~/cairo_projects
cd ~/cairo_projects

对于Windows CMD,请输入以下内容:

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

用Scarb创建一个项目

让我们使用 Scarb 创建一个新项目。

导航到你的项目目录(或你决定放代码的地方)。然后运行以下命令:

scarb new hello_world

它创建了一个新的目录和项目,名为hello_world。我们把我们的项目命名为hello_world,因此Scarb会在同名的目录下创建它的文件。

cd hello_world命令进入hello_world目录。你会看到Scarb已经为我们生成了两个文件和一个目录:一个Scarb.toml文件和一个src目录,里面有一个lib.cairo文件。

它还初始化了一个新的Git仓库和一个.gitignore文件

注意:Git是一个常见的版本控制系统。你可以通过使用--vcs标志停止使用版本控制系统。 运行scarb new -help以查看可用选项。

在你选择的文本编辑器中打开 Scarb.toml 。它看起来应该与示例1-2中的代码相似。

文件名: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" }

示例1-2:由scarb new生成的Scarb.toml的内容

这个文件是TOML(Tom's Obvious, Minimal Language)的格式,是Scarb的配置文件格式。

第一行,[package],是一个章节标题,表示下面的语句是在配置一个包。随着我们向这个文件添加更多的信息,我们将添加其他章节。

接下来的两行设置了Scarb在编译你的程序时需要的配置信息:名称和要使用的Scarb版本。

最后一行,[dependencies],是一个章节的开始,该章节供你列出你的项目的所有依赖。在Cairo中,代码包被称为crate。在这个项目中,我们不需要任何其他的crate。

注意:如果你要为Starknet构建合约,你需要添加Scarb文档中提到的starknet依赖关系。

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模块的实现细节的文件hello_world.cairo

Scarb要求你的源文件位于src目录中。

顶层项目目录是为README文件、许可证信息、配置文件和任何其他与代码无关的内容保留的。 Scarb确保所有项目组件都有一个指定的位置,维持一个结构化的组织架构。

如果你启动了一个不使用Scarb的项目,你可以把它转换成一个使用Scarb的项目。将项目代码移到src目录下,并创建一个适当的Scarb.toml文件。

编译Scarb项目

在你的hello_world目录中,通过输入以下命令来编译你的项目:

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

这个命令在target/dev中创建了一个sierra文件,现在我们先忽略sierra文件。

如果你正确安装了Cairo,你应该能够运行并看到以下输出:

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

Run completed successfully, returning []

无论你的操作系统如何,终端里都应该打印出字符串Hello, world!

如果 "Hello,world!"打印出来了,那么恭喜你!你已经正式写了一个Cairo程序! 你已经成为了一名Cairo程序员--欢迎!

解析Cairo程序

让我们详细回顾一下这个 "Hello,world!"程序。这里有拼图的第一部分:

fn main() {

}

这些代码定义了一个名为 main的函数。main函数很特别:它总是每个可执行的Cairo程序中运行的第一个代码。 这里,第一行声明了一个名为 main的函数,没有参数,也不返回。如果有参数,它们会被放在括号()里。

函数主体被包裹在"{}"中。Cairo要求在所有的函数体周围加上大括号 将开头的左大括号与函数声明放在同一行是很好的编码风格。 别忘了在它们中间加一个空格。

注意:如果你想在Cairo项目中使用一个统一代码风格标准,你可以 使用自动格式化工具scarb fmt来将你的代码格式化为 特定的代码风格(更多关于scarb fmt的信息见 附录D)。Cairo团队已经将这个工具 包含在标准的Cairo发行版中,就像cairo-run一样,所以它应该已经被 已经安装在你的计算机上了!

在主函数声明之前,use debug::PrintTrait;一行负责导入另一个模块中定义的项目。在这个例子中,我们从Cairo核心库中导入了PrintTrait项目。通过这样做,我们获得了在可以打印的数据类型上使用print()方法的能力。

main函数的主体包含以下代码:

    'Hello, World!'.print();

这一行完成了这个小程序的所有工作:将文本打印到屏幕上。这里有四个重要的细节需要注意。

首先,Cairo的风格是用四个空格缩进,而不是用制表符。

第二,调用的print()函数是来自traitPrintTrait的一个方法。这个trait是从Cairo核心库中导入的,它定义了如何将不同数据类型的值打印到屏幕上。在我们的例子中,我们的文本被定义为 "short string",这是一个ASCII字符串,可以适合Cairo的基本数据类型,即felt252类型。通过调用'Hello, world!'.print(),我们正在调用PrintTraittrait的felt252实现的print()方法。

第三,看见了'Hello, world!'短字符串么。我们把这个短字符串作为一个参数传递给print(),因此短字符串被打印到屏幕上。

第四,我们用分号(;)来结束这一行,这表示这个表达式已经结束,下一个表达式准备开始。大多数Cairo的代码行以分号结束。

运行测试

要运行与特定软件包相关的所有测试,可以使用scarb test命令。 它本身并不是一个测试运行工具,而是将测试工作委托给所选的测试工具。Scarb预装了scarb cairo-test扩展,它捆绑了Cairo的本地测试运行器。它也是scarb test默认使用的测试运行器。 要使用第三方测试运行器,请参考Scarb文档

测试函数用#[test]属性标记,运行scarb test将运行代码库中src/目录下的所有测试函数。

├── Scarb.toml
├── src
│   ├── lib.cairo
│   └── file.cairo

Scarb 项目结构示例

让我们回顾一下到目前为止我们所了解到的关于Scarb的情况:

  • 我们可以使用 scarb new 创建项目。
  • 我们可以使用 scarb build 生成编译后的 Sierra 代码。
  • 我们可以在 Scarb.toml 中定义自定义脚本,并使用 scarb run 命令调用它们。
  • 我们可以使用 scarb test 命令运行测试。

使用Scarb的另一个好处是,无论你在哪个操作系统上工作,命令都是一样的。所以我们将不再提供Linux和macOS与Windows的具体说明。

总结

你的Cairo之旅已经有了一个很好的开始!在本章中,你已经学会了如何:

  • 安装最新稳定版本的 Cairo
  • 直接使用 scarb 编写并运行 “Hello, world!”程序
  • 使用 Scarb 的默认设置创建并运行一个新项目
  • 使用 scarb test 命令执行测试

是时候通过建立更多实用程序来熟悉阅读和编写Cairo代码了。

Last change: 2023-10-03, commit: eafa093