作者:Darington Nnam
原文:Journey through Cairo I - Setting up Protostar and ArgentX for local development翻译:Louis Wang
校对:StarkNet 中文社区
在过去的几个月里,我一直在关注以太坊的众多扩展方案,最近我对 Starknet 产生了浓厚的兴趣,这是 Starkware 团队创建的 Layer2 扩展解决方案。
虽然围绕扩容以太坊的竞争主要集中在 EVM 的兼容性上,以支持以太坊已经蓬勃发展的生态系统,但 Starkware 采取了一个相当大胆的举动,创建了一个全新的虚拟机,用自己的语言 Cairo 来编写智能合约。
这样做有很多优点,因为他们从根本上获得了 zk 的兼容性,但也带来了很多挑战,主要是围绕开发者的开发。在一个全新的生态系统中起步需要很多东西,从学习新的语言到适应相对较新的开发工具,这对大多数 Solidity 的开发者来说,是要花时间、担风险。
我最近决定为 Starknet 开发探索 Cairo,在接下来的几个月里,我将记录我的 Cairo 之旅,以帮助其他想在这个领域起步的人。
Starknet 生态系统中最流行的说法之一是 「CAIRO 太难」,说实话他们可能没说错,因为在过去的几周里,我花了很多时间阅读官方文档,毫不夸张地说,Cairo 是我迄今为止遇到的最难的编程语言。但是,注意在写这篇文章的时候,Cairo 本身是比较新的,根据 Cairo 的联合创始人说,这门语言最初是为内部使用而创建的,最初并没有打算让它公开。目前 Cairo 有很多工作要做,主要是针对更好的开发体验,所以肯定会慢慢变好的。
Cairo 是第一种用于编写通用计算的可证明程序的图灵完备语言。
在接下来的文章中,我们将深入研究 Cairo 的一些基本原理,并动手在 Starknet 上编写智能合约,但今天,让我们专注于建立本地的开发环境,并部署我们的第一个合约!
有很多的框架可用于本地 Cairo 开发,其中有 Software Mansion 团队开发的 Protostar, Openzeppelin 团队开发的 Nile,以及 Hardhat。
我试着配置了 Protostar 和 Nile,觉得 Protostar 更容易配置和使用,但目前没有对 Windows 的支持,所以 Windows 用户可能要考虑设置 Windows Subsystem for Linu (WSL) 或尝试 Nile 框架。
要设置 Windows Subsystem for Linux,请看这里的教程。
要开始使用 Protostar,先在 $PATH
中添加一个 git 可执行文件(2.28 及之后的版本)。
1. 运行以下指令:
curl -L https://raw.githubusercontent.com/software-mansion/protostar/master/install.sh | bash
2. 重启终端
3. 执行 protostar-v
来确认安装成功。正确安装后应该看到:
1. Protostar 和 Truffle 类似,安装一次后多个项目都可以使用,初始化一个新项目:
protostar init
2. 要求提供项目的名称和库的目录名称
从上图可以看到,一个初始化的新 Protostar 项目,会创建一个包含 3 个新文件夹和一个 protostar.toml 文件。
lib 文件夹 —— 是包含所有项目依赖性的文件夹。
src 文件夹 —— 是包含你的合同源代码的文件夹。
test 文件夹 —— 是包含你的测试文件所需的文件夹。
protostar.toml
是命令配置的文件。根据官方文档,它可以用来避免每次运行命令时传递参数。Protostar 在 ["protostar.COMMAND_NAME"]
部分会自动搜索参数值,比如:
#...
["protostar.build"]
cairo-path = ["./lib/cairo_contracts/src"]
在 src 文件夹中,我们已经有一个默认创建的模板合约 basic.cairo,我们将在本教程中部署,但为了与部署的合约交互,我们需要一个钱包,比如 ArgentX。
%lang starknet
from starkware.cairo.common.math import assert_nn
from starkware.cairo.common.cairo_builtins import HashBuiltin
@storage_var
func balance() -> (res : felt):
end
@external
func increase_balance{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}( amount : felt):
with_attr error_message("Amount must be positive. Got: {amount}."):
assert_nn(amount)
end let (res) = balance.read()
balance.write(res + amount)
return ()
end
@view
func get_balance{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}() -> ( res : felt):
let (res) = balance.read()
return (res)
end
@constructor
func constructor{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}(): balance.write(0)
return ()
end
在写这篇文章的时候,Metamask,也就是 EVM 开发中最常用的钱包还不支持 Starknet(即将支持),但是我们有另外两个钱包 ArgentX 和 Braavos,可以用来与原生 Starknet 合约进行交互。在今天的教程中,我们将介绍 ArgentX 的设置。
与基于 EVM 的链相比,Starknet 的突破之一是实现了账户抽象,这在很大程度上是指从链的核心协议中抽象出账户的概念和相关机制。因此我们希望在与账户如何验证和运行有关的方面具备灵活性和可扩展性。
简单地说,在 Starknet 上没有外部拥有的账户 (EOA),但每个账户都是一个内置可多调用的智能合约。
在 Chrome 上访问 Chrome 扩展市场,其他浏览器查看其扩展市场。将该扩展添加到你的 Chrome 浏览器。按照说明,创建一个新密码,然后创建一个新账户。
你会注意到与其他钱包如 Metamask 实施外部拥有的账户模式不同,在 ArgentX 上创建一个新的账户或钱包需要部署一个新的合同。这就是账户抽象,如我们前面所说,每个账户都是一个智能合约。
一旦安装好 ArgentX,就可以开始部署我们的第一个 Starknet 合约了。
我们将要部署之前那个 basic.cairo 合约:
1. 先要创建环境,执行:
protostar build
2. 执行 Protostar 的部署命令,部署到测试网:
protostar deploy ./build/main.json --network alpha-goerli
deploy
命令是 protostar 的一个内置命令。
./build/main.json
指定了我们编译文件的路径。
--network
变量用于指定我们要部署到的网络。
有关 protostar 部署命令的更多信息,请查看文档。
部署后,在屏幕上输出我们的合约地址和交易哈希,但是我们如何查看这个合约并与之交互呢?
与以太坊上的 Etherscan 类似,Voyager 是 StarkNet 的区块浏览器。它由 Nethermind 的内部团队开发,为任何人提供了一个与他们的 Starknet 合约进行交互的窗口。Starknet 的部署可能需要一段时间,所以如果在 Voyager 上查询合约时收到一条错误消息,“抱歉,我们无法找到此合约。”也无需担心。
由于我们部署到 Goerli 测试网,我们需要从主网切换到 Goerli,位于 Voyager 的右上角。
等待一段时间后,我们现在可以在这里看到我们的合同反映在 Voyager 上。
我们也可以从 Voyager 读取和写入合约,但我们需要一些测试 ETH 来支付 gas,你可以从 Starknet 的水龙头获得。
恭喜你成功地将你的第一个合约部署到 Starknet!
不知道你是否注意到,与我们部署到以太坊和其他基于 EVM 的链时不同,我们并不特别需要签名者对象来支付合约部署的 gas 费?因为我们并没有特意从我们的 Argent 钱包部署我们的合约(由默认钱包部署),而且由于 Starknet 仍处于 Alpha 阶段,因此对于合约部署而言,gas 费并不是特别强制性的,但这肯定会在未来改变。