# 通过Starklings学习Cairo 1.0 (一)

By [LVIS](https://paragraph.com/@lviswang) · 2023-02-04

---

Starklings
----------

在之前的Cairo 0.10版本的学习中，发现一个非常神奇的工具[Starklings](https://github.com/onlydustxyz/starklings)，可以以一种交互式的方式轻松学习Cairo，有点像学习Solidity时的[打僵尸教程](https://cryptozombies.io/)（crypto zombie），是由[OnlyDust](https://twitter.com/OnlyDust_xyz)编写的，OnlyDust也是Starkware的战略合作伙伴。

[https://github.com/onlydustxyz/starklings](https://github.com/onlydustxyz/starklings)

最近偶然看到了Cairo 1.0版本的Starklings，不过好像不是OnlyDust官方出品，但是使用方法上和之前非常类似，我也不挑了，能学就行。

目前该repo只更新了4则非常简单的cairo 1.0的语法，看起来甚至有点无聊，说明也较少，不过可以关注着，在这记录Starklings的使用方法。

[https://github.com/shramee/starklings-cairo1](https://github.com/shramee/starklings-cairo1)

使用方法
----

### 1\. 克隆该仓库到本地，下载配套的rust工具。

1.  Cairo 0.1是类python的，而1.0是类Rust的，所以我们需要先安装Rust。多提一句，Cairo的编译器Sierra也是用Rust写的。上个月底，Starware宣布了他们正在开发一个新的由Rust编写的开源Sequencer(定序器)— blockifier。
    
    [https://starkware.medium.com/starknets-new-sequencer-339e63845003](https://starkware.medium.com/starknets-new-sequencer-339e63845003)
    

![](https://storage.googleapis.com/papyrus_images/0ea5facedbbfd72b32c43096874cd8740e36687dd0129315ab91942968b2eede.jpg)

这是以太坊不同客户端不同交易的处理数据的对比。“Python 客户端是众所周知的慢和贵。StarkNet 换 Rust 客户端后会直接提高 TPS 和降低 Gas ”。但是客户端的优化能提高TPS可以理解，为什么能或者什么情况下能降低Gas呢？可以看看这条thread的解析：

[https://twitter.com/cryptonerdcn/status/1621351302566666242?s=20&t=-U3LGxldbq8PhcvLHoCHow](https://twitter.com/cryptonerdcn/status/1621351302566666242?s=20&t=-U3LGxldbq8PhcvLHoCHow)

回到Starklings，安装完成后按照指引，运行`cargo run --bin starklings watch`就可以进入starklings的学习了！

![](https://storage.googleapis.com/papyrus_images/731b4e5e506ebc0ef261b41e9ae9ce239864a8f140f45c7d04a16cadc3b96922.png)

### 2\. 怎么用？

运行完该命令后会让进入watch mode，把这个终端放在一边不用去管，打开vscode，到`exercises/intro`文件夹里进行编辑。在注释行里会有基本的语法介绍，想让你了解学习的内容，掌握之后根据要求修改程序，使其能够成功编译就算过关。

回到处于watch mode的终端，就可以看到报错或者提示成功，完成编译后，将`//I AM NOT DONE`一行删除，就可以进入下一个练习了。

![](https://storage.googleapis.com/papyrus_images/2a77858e5719724b7ce7365bb16e91e1c409f2f8335227c68d07bc53b1f1270a.png)

### 3\. intro1-4.cairo

目前更新的1-4都是非常简单的，作者正在更新十多个语法点，可以保持关注。

**intro 1**

![](https://storage.googleapis.com/papyrus_images/44d748db58337bf335362919ae8c17c2d4fc917081aa6826948f7917393d524d.png)

这里告诉大家Cairo1必须要有个main函数才算有效，尽管这个是空的。不需要做任何修改就能编译，直接移除`//I AM NOT DONE` 进入下一个练习。

**intro 2**

这里一片空白，提示说这个练习无法编译。想到intro1里介绍，cairo1必须要有个main函数才有效，于是添加

`fn main() {}`

![](https://storage.googleapis.com/papyrus_images/6e5b21a0cdea55758af463179ae9c2975c6bb3df99c186581283563ac4a61ae5.png)

回到终端查看是否成功：

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

**intro 3**

这里开始介绍cairo的类型。felt（field element，域元素）是cairo的基本类型，数字，字符串，地址通通由它表示。它是定义在 的整数，其中 P 是一个非常大的质数。在目前的版本中，P = 2^{251}+17\*2^{192}+1，大小为252 bit。P 具有一些很好的数学性质用于零知识证明，因此没有选择和Solidity一致的256 bit。在cairo 0.10中仅支持这一种类型，在1.0中不知道是否有更多类型。

这个练习中定义了输入的类型，即a,b都为felt，add函数中缺少返回类型，加上个返回felt就可以了：

![](https://storage.googleapis.com/papyrus_images/6729239137413fc695cb750258bf0e8f0139480ba346e7b5159a5298b8bc988c.png)

**intro 4**

这里提了在编写函数内容时，如果在结尾不加分号`；`，就会自动返回这行的结果，这会使得代码看起来更简洁。这里他以add函数作为例子，我们需要修改sub函数和main函数：

![](https://storage.googleapis.com/papyrus_images/814babe1c2f56c0c19231f2f34d5abd8029622f5e9487fa9e949ca633805226f.png)

到此为止，4个练习就都完成啦！

![](https://storage.googleapis.com/papyrus_images/21c33fce5121d64548590ee294529014073747cf69163d4f8a6794e2686231cc.png)

关于Cairo1的语法，最好的是追踪官方的仓库：

[https://github.com/starkware-libs/cairo](https://github.com/starkware-libs/cairo)

但是由于是基于rust的，学rust也准没错，可以参考[@Asten](https://twitter.com/0xasten)正在更新的中文版rust文档：

[https://github.com/0xAsten/rust-book-zh](https://github.com/0xAsten/rust-book-zh)

欢迎交流：
-----

[https://twitter.com/lviswang](https://twitter.com/lviswang)

[Subscribe](null)

---

*Originally published on [LVIS](https://paragraph.com/@lviswang/starklings-cairo-1-0)*
