如何在 Starknet 上部署 Cairo 合约
2023-01-30 16:50
Lvis 的专栏
2023-01-30 16:50
Lvis 的专栏
2023-01-30 16:50
订阅此专栏
收藏此文章

Starknet 是以太坊 L2 rollup 四巨头之一,属于 zk rollup(其实是 validity rollup,只用到 zk 的简洁性,即证明压缩,而没有用到 zk 的隐私性),以 80 亿美元的估值募资 3 亿。但是由于开发门槛等原因,目前生态项目并不像 Arbitrum、Optimism 这么丰富,但是 zk、L2、L3 等叙事让这块土地注定成为一片淘金地。同时 Starknet 上也有自己的特色项目,比如全链游戏(全链游戏并不是只存在于 Starknet 上,但是 Starknet 主推,并有几款已经上线)。

Starknet 采用的并非是以太坊兼容的虚拟机,而是 cairoVM,编写智能合约的语言也非 solidity 而是 Starkware 自己开发的 cairo。这样的好处是直接摒弃了 EVM 的历史包袱,灵活性更强,账户抽象 AA 是一等公民。目前 0.10.3 的版本还是类 python 的,cairo1.0 以后就定型为类 Rust 的语言不再大改了,cairo1.0 预计在二月中正式发布。

cairo 本质上是一门 zk 友好的编程语言,它并不局限于区块链,以后会有更多的想象空间。学习 cairo 开发的一个难点在于:cairo 还是个非常年轻的语言,它本身包括配套的 tooling 更新太快了,而学习资料总是相对落后,经常会有一些命令在版本更新中已经弃用,开发者看的教程还是老的,直接奔溃。而且 cairo 的华语开发者和中文学习资料都较少,我之前翻译的 Cairo 之旅是个很好的教程,但是三个月后再看也已经有些过时了。

https://mirror.xyz/starknet-zh.eth/PSNMGAXKIrXvxhILjp35aM3tW4c4AnGclfzMlQ5hQ64

写这篇文章的契机是,我在去年拿到了 Starknet 的开发 grant,但是由于 cairo1.0 的发布在即(当时说年底),我决定做一做等等党,结果 cairo1.0 的发布也延迟了。1 月参加了 basecamp,重拾 cairo。cairo 的更新是语法上的更新,更丰富更简单,但是整个部署合约的方法流程不会大改。学会如何部署合约之后,就可以自由学习、探索 cairo 合约,自己尝试了。所以奖部署方法写在这保持更新,方便自己,能帮助到需要的人就更好了。

https://medium.com/starknet-edu/choosing-a-starknet-development-tool-d4335d0e62a5?source=collection_home—4——6———————–

Starknet 上合约的部署工具有很多,David 最新更新的一条推特也罗列了所有方法的优缺点。我这里选择的是 protostar,类似于 foundry。好处是不用切换语言,合约、测试都用 cairo 写,protostar 有自己的 cairo-lang 包,不依赖于 python 包,setup 简单,流程方便,缺点是对 web2 开发者不友好,没有用上本身擅长的技能。我本身并没有很擅长的编程语言,所以对我来说 protostar 只有优点,没有缺点 : )

https://twitter.com/barretodavid/status/1616620125079363591?s=20&t=fjnMAtXMVfK_cokZpNAbvg

这里我将一步一步,记录如何在 Starknet 上用 protostar 部署合约,让所有初学者都能跟上(水平高的直接看 starknet 的 git repo 就行了)

  1. 安装 protostar

具体安装命令如下:

https://docs.swmansion.com/protostar/docs/tutorials/installation

注意目前还没有 windows 版本: (

  1. 建立项目

执行protostar init,初始化一个项目,生成三个文件(夹):src 是放合约的,tests 放测试脚本的,以及一个protostar.toml,用来进行项目配置的(比如指定路径,指定版本号等)。

   ❯ tree -L 2   .   ├── protostar.toml   ├── src   │   └── voting.cairo   └── tests       └── test_main.cairo

如果你的合约复杂,需要引用一些现成的库,那需要用 protostar 来装这些库,例如:

protostar install OpenZeppelin/cairo-contracts@v0.5.1

protostar install https://github.com/CairOpen/cairopen-contracts

这时候就会多生成个 lib 文件夹,存放库的。

  1. 部署合约

用 Protostar 部署合约的流程实际上就三步:

1. 编译(Compile)

.cairo合约文件进行编译,生成编译完的.json文件,存放在自动生成的 build 文件夹里面。同时获得编译合约的 class hash。

执行protostar build ,对protostar.toml 里标记的合约进行编译,获得对应的 class hash。这里我标记了两个要编译的合约,就会得到两个对应的 class hash。

2. 申明(Declare)

对编译完的.json文件进行申明。申明相当于部署了一个变量不存值的合约,方便别人使用(这里如果理解有误请指出)。

执行protostar declare ./build/basic.json --network testnet --account-address 0x046c5877EE8d297107Bd8E507Fb97b8cAB4ECD6C83892AD92EA40100412b4976 --max-fee auto

这是在用 account-address 这个地址,申明编译完的合约。在此之前,需要先执行 export PROTOSTAR_ACCOUNT_PRIVATE_KEY=[YOUR PRIVATE KEY HERE],使用钱包(如 argent)导出私钥,执行如:export PROTOSTAR_ACCOUNT_PRIVATE_KEY=0xe3e70682c2094cac629f6fbed82c07cd

我们得到结果:

3. 部署(Deploy)

将合约部署到 Starknet 测试网上,其实我们是在调用 Openzepplin 创建的 UDC(Universal Deployer Contract)帮我们部署,也就是说我们在调用 UDC 这个合约的部署功能,真神奇。具体原因可以参考这篇文章:

https://www.argent.xyz/blog/understanding-the-universal-deployer-contract/

执行 protostar deploy [classhash] --network testnet --account-address 0x046c5877EE8d297107Bd8E507Fb97b8cAB4ECD6C83892AD92EA40100412b4976 --max-fee auto --inputs 10

最终得到部署的合约地址,以及对应的浏览器查询地址:

过几分钟可以到 StarkScan 上查看到我们刚刚部署的合约就是成功了!

学会如何部署合约之后,就可以参考Stark-edu 的一些列教程自由探索了!这个 cairo 学习笔记系列,放在我的 github 里,保持更新,喜欢的可以关注一下:

https://github.com/LvisWang/Starknet

我的Twitter@lviswang 欢迎交流!

Ref:

https://www.argent.xyz/blog/understanding-the-universal-deployer-contract/

https://github.com/starknet-edu/walking-with-starknet/blob/master/tutorials/tutorials/EN/4_protostar.md

https://github.com/starkware-libs/cairo

subscribe://

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

Lvis 的专栏
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开