部署 Starknet Cairo 1 合约

前言

Starknet 是一种基于 zk rollup 的 L2 解决方案,非 EVM 兼容,使用自己开发的 Cairo 语言来编写链上的智能合约,而非 Solidity。目前 Cairo 1.0 已经发布,基于 rust 语言实现。之前的版本是基于 python 语言,属于两个独立的代码仓库。

Cairo one 编译器安装

本地安装 Rust

https://www.rust-lang.org/zh-CN/tools/install

本地安装 Cairo one 编译器

git clone https://github.com/starkware-libs/cairo/
cd cairo
git checkout 9c190561ce1e8323665857f1a77082925c817b4c
cargo build --all --release

本地安装 Cairo one 编译器

Starknet CLI 安装

注:目前这一部分还在旧版的代码仓库中。

  • 创建 python 虚拟环境

python3.9 -m venv ~/cairo_venv_v11
source ~/cairo_venv_v11/bin/activate

也可以采用其他方式,比如 conda 之类的。

  • 若之前已经安装,需要卸载

pip3 uninstall cairo-lang
  • 下载最新的代码包(cairo-lang-0.11.0.1.zip)

curl https://github.com/starkware-libs/cairo-lang/releases/download/v0.11.0.1/cairo-lang-0.11.0.1.zip
  • 本地安装

pip3 install cairo-lang-0.11.0.1.zip
  • 验证

starknet --version
  • 导入依赖

cp cairo/target/release/starknet-sierra-compile ~/cairo_venv_v11/lib/python3.9/site-packages/starkware/starknet/compiler/v1/bin/starknet-sierra-compile

编译合约

  • 下载 demo 合约

cd ..
git clone https://github.com/starknet-edu/deploy-cairo1-demo
mv deploy-cairo1-demo/hello_starknet.cairo .
  • 编译

// 切换至 cairo one 编译器所在目录
cd cairo
cargo run --bin starknet-compile -- ../hello_starknet.cairo ../hello_starknet.json --replace-ids

编译后得到 hello_starknet.json 文件。

创建测试账号

  • 设置环境

export STARKNET_NETWORK=alpha-goerli
export STARKNET_WALLET=starkware.starknet.wallets.open_zeppelin.OpenZeppelinAccount
  • 创建账号

starknet new_account --account <your account name>
  • 领水

去官方网站 StarkNet Faucet 领水。

  • 部署账号

注:每一个 starknet 账户,都是一个合约,因此创建完之后需要部署。

starknet deploy_account --account <your account name>

声明合约

cd ..
starknet declare --contract hello_starknet.json --account <your account name>

声明后得到 class hash 以及交易 hash 值。

部署合约

starknet deploy --class_hash <class_hash> --account <your account name>

部署后得到合约地址以及交易 hash 值。

至此,大功告成。

总结

  • 后续 Cairo One 编译器安装与 Starknet CLI 安装应该会融为一体,提供诸如 starknet compile 命令,促使更好的开发体验。

  • Starknet 的账户使用的是 AA(Account Abstraction) 账户,每一个账户都对应一个合约。

  • 部署合约之前,需要先进行一步声明。

参考

https://github.com/starknet-edu/deploy-cairo1-demo