热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Cairo之旅II:通过Starklings掌握Cairo语法

作者:DaringtonNnam原文:JourneythroughCairoII—MasteringCairo’sSyntaxeswithStarkl

作者:Darington Nnam原文:Journey through Cairo II — Mastering Cairo’s Syntaxes with Starklings翻译:Louis Wang校对:「StarkNet 中文社区」

在上篇文章中,我们用 Protostar、ArgentX 和 Voyager 为 Cairo 建立本地开发环境,我们将从今天开始了解 Cairo 的基本原理,并尝试用 Starklings 作为教材来解释 Cairo 的基本功能。

OnlyDust 的 Starklings

直接通过官方文档来学习 Cairo,对普通人比较困难。刚开始我努力的去理解这些基础知识,直到发现了 Starklings

Starklings 是由 OnlyDust 团队编写的互动式教程,其采纳流行的渐进互动式 Rust 教程 Rustlings 的长处。今天,我们将通过解决 Starklings 中的问题,开始了解 Cairo 如何工作。

安装

为了高效学习本教程,需要提前设置你的计算机环境:

访问 Starklings 的官方 Github repo。

复制运行 git clone 指令到本地计算机上。

git clone --branch stable --single-branch

安装指令运行的必需工具:

curl -L | bash

开始测试,打开终端并执行:

starklings --watch

命令和资源

现在我们已完成开发环境,在潜心编写 Cairo 前,这里一些必要指令和资源,会让开发更简单!

  1. 在没进入观察模式前手动验证测试,请运行以下:

starklings --verify relative_path_to_the_exercise_file

  1. 如果解决不了测试,可以检索答案:

starklings --solution relative_path_to_the_exercise_file

  1. 如果想自由发挥尝试更多,可以试试与 Solidity Remix (以太坊智能合约开发 IDE)相似的 Cairo‘s playground 。

理解 Cairo 语法

syntax01.cairo — 从 Cairo 合约开始

开始使用 Cairo 时,如何区分 Cairo 程序和 Cairo 合约。为了避免相同的困惑,以下是两者的快速定义:

Cairo 程序:Cairo 程序可以理解为一种无状态合约,意味着在编写程序时,不能访问存储,不能与其他 Cairo 程序包括 L1 链进行交互。

Cairo 合约:简单来说,这是运行在 Starknet 虚拟机 (VM) 上的程序。由于在虚拟机上运行,因此他们可以访问 Starknet 的持续状态,改变或修改 Starknet 的变量状态,与其他合约交互,并与底层 L1 无缝交互。

理解后,就可以开始写一个 Cairo 合约,你必须指定它是一个合约并在最顶行写上:

%lang starknet

下一步,在 Starklings 的 Syntax01.cairo 中完成,并检查能否通过测试:

成功运行!

接下来是第二个测试,删掉 #I AM NOT DONE,Starkligns 会引导你进入下一个测试!

syntax02.cairo — Cairo 模块化

就像大部分现存的编程语言一样,把所有程序代码保存在一个文件里是非常不明智的做法。你也可能需要使用他人的代码,而不是重新发明轮子,所以每种语言都鼓励代码模块化,Cairo 也不例外。

在这个测试中,我们要研究 test_ok 函数,使该函数工作需要并导入所有重要文件。

在 Cairo 中导入一个文件:

from starkware.starknet.common.syscalls import get_contract_address

当你这样做时,Cairo 会在当前目录和相对于编译器路径的标准库目录中搜索文件 *syscall.cairo*,并从中导入 get_contract_address 函数。

我们的函数 test_ok 需要三个隐参数:syscall_ptr、pedersen_ptr 和 *range_check_ptr*(我们将在后文介绍隐参数)。但我们注意到,允许计算 Pedersen 哈希函数的 pedersen_ptr 需要一个 HashBuiltin,而这一参数并不存在于当前文件中,所以需要从 Cairo 函数库导入,我们要在代码中添加:

from starkware.cairo.common.cairo_builtins import HashBuiltin

成功运行!

func takes_two_arguments_and_returns_one(a: felt, b: felt) -> (c: felt):return (a + b) # Do not changeend

正如你所看到的,我们给 a,b,c… 参数传递了一个奇怪的数据类型 **felt,** 没错!不同于 Solidity 有许多数据类型,如 uint256,字符串等,Cairo 使用的是一种被称为 felt 的数据类型(我们会在以后的文章中深入讨论这个问题)。

从我们的函数签名中,能发现我们传入了一个不被函数使用的 c 参数。这个参数就是该函数的返回值。你的返回值通过 -> 来指定。

Cairo 命名空间是在合约中使用模块的一种非常强大的方式。当从多个模块导入时,它允许你在一个标识符下定义函数范围,有助于防止冲突。它还有助于提高代码可读性。

在 Cairo 执行一个命名空间,要使用 namespace 关键字,为命名空间指定一个名字:

namespace starklings func starkling_exercise(a: felt, b:felt) -> (c: felt): return (a+b) endend

从文件中使用命名空间中的函数:

starklings.starkling_exercise(3, 5)

为了通过执行了命名空间的测试,需要在命名空间 my_namespace 内调用 return_something 函数。

Cairo 和 Solidity 有着极度相似的结构体概念。

首先用 struct 关键字定义,然后用 member 关键字指定其属性。不同于 Solidity 的是,Cairo 中的结构体也有一个 size 属性,即其成员规模之和。

在 Cairo 中的结构体:

struct Starklings: member first: felt member second: feltend

为了通过测试,我们要执行一个 Currency 结构体。

需要检查测试找出结构体的成员。调用结构体测试的第 13 行:

local euro : Currency = Currency('Euro', 2)

在此,我们注意到结构体有两个成员,可能分别是名称和 ID,但是 14 行出现:

assert euro.name = 'Euro'

修改结构体来通过测试:

struct Currency: member name: felt member id: feltend

最后

到这里,我想你现在已经很好理解了 Cairo 的基本语法、函数参数、命名空间、结构体等。

在下一讲中,将通过字符串挑战,并深入了解什么是 felt

如果觉得本教程对你有帮助,转发分享给其他人吧~


推荐阅读
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • [转载]从零开始学习OpenGL ES之四 – 光效
    继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在使用Visual Studio 2019评估Blazor时,将taghelper添加到剃刀文件时会出现错误。错误信息是"标记助手:@addTagHelper *,BlazorPOC.Validations"。需要在文件顶部添加@using语句"@using BlazorPOC.Validations"来解决这个问题。 ... [详细]
author-avatar
手机用户2502921877
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有