一、工具
remix: Remix - Ethereum IDE
编程语言:cairo
学习参考:
1)WTF-cairo github.com/WTFAcademy/WTF-Cairo
2)Scarb: The Package Manager - The Starknet Book
二、电脑上配置环境
1)Starkli, 可以与Startnet各种环境交互的客户端工具
安装命令:
curl https://get.starkli.sh | sh
starkliup
2)Scarb, 编译工具
安装命令:
curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh
3)Katana,本地部署的startnet环境,类似(ganache,或者foundry的anvil)
安装命令:
curl -L https://install.dojoengine.org | bash
dojoup
三、用一个程序部署本机全流程演示一遍
1、创建项目:
scarb new smartcase
在src/lib.cairo下替换如下代码:
#[starknet::contract]
mod hello {
#[storage]
struct Storage {
name: felt252,
}#[constructor]
fn constructor(ref self: ContractState, name: felt252) {
self.name.write(name);
}#[external(v0)]
fn get_name(self: @ContractState) -> felt252 {
self.name.read()
}
#[external(v0)]
fn set_name(ref self: ContractState, name: felt252) {
let previous = self.name.read();
self.name.write(name);
}
}
2、打开一个新的终端
touch src/.env
输入如下内容:
export STARKNET_ACCOUNT=katana-0
export STARKNET_RPC=http://0.0.0.0:5050运行:
source src/.env
katana
输出如下:
3、在原先终端编译:
命令:scarb build
此时编译后的中间文件,就存放在target/dev目录下了
ls -la target/dev/
smartcase.starknet_artifacts.json
smartcase_hello.contract_class.json
命令:(声明declare)
starkli declare target/dev/smartcase_hello.contract_class.json
输出:
Sierra compiler version not specified. Attempting to automatically decide version to use...
Unknown network. Falling back to the default compiler version 2.1.0. Use the --compiler-version flag to choose a different version.
Declaring Cairo 1 class: 0x00b9535d9e97b840cc8bbf73b207875cafd1d948d420362e33418fd4a53fe36e
Compiling Sierra class to CASM with compiler version 2.1.0...
CASM class hash: 0x05f2d2a3a5bc9f40d2ac9e2b63d19d74829478833b3ddb824e46e2325df79c49
Contract declaration transaction: 0x05a2e023eabfcfe2d1aba0a83e94824d755763fe0f6ed495d2569b70689390f1
Class hash declared:
0x00b9535d9e97b840cc8bbf73b207875cafd1d948d420362e33418fd4a53fe36e
4、部署
两个前提:
1、必须有hash code
2、需要构造参数
此处需要注意,由于构造参数需要一个字符串,但是部署时候不能直接输入字符串,只能是16进制串。所以需要转换。
比如:参数是 hellosmart,转换的方法是:
starkli to-cairo-string hellosmart
0x68656c6c6f736d617274
所以部署的命令就是:
starkli deploy 0x00b9535d9e97b840cc8bbf73b207875cafd1d948d420362e33418fd4a53fe36e 0x68656c6c6f736d617274
运行结果是:
Deploying class 0x00b9535d9e97b840cc8bbf73b207875cafd1d948d420362e33418fd4a53fe36e with salt 0x07184a76a681f316cbf19f606067148f5fefecd9c969954fd7f79c75aa2278d9...
The contract will be deployed at address 0x002d19d5de44c5d17eb6422b4aed8d1d0a1089a011ed224ae7ec85f09c017b04
Contract deployment transaction: 0x0130ea9e91b60a46c71e4409fcc11f98559e4c921053c1d7efd6aa245a0ff9a2
Contract deployed:
0x002d19d5de44c5d17eb6422b4aed8d1d0a1089a011ed224ae7ec85f09c017b04
5、与合约交互
两种交互命令:
call :调用合约只读函数
invoke: 调用合约读写函数
starkli call 0x002d19d5de44c5d17eb6422b4aed8d1d0a1089a011ed224ae7ec85f09c017b04 get_name
[
"0x0000000000000000000000000000000000000000000068656c6c6f736d617274"
]
此处调用get_name 返回的是一个16进制串,需要使用函数转换成可读字符串
starkli parse-cairo-string 0x68656c6c6f736d617274
hellosmart
接下来,调用修改合约状态函数
1、先转换要写入的字符串
starkli to-cairo-string hellomybaby
得到:
0x68656c6c6f6d7962616279
2、starkli invoke 0x002d19d5de44c5d17eb6422b4aed8d1d0a1089a011ed224ae7ec85f09c017b04 set_name 0x68656c6c6f6d7962616279
返回:
Invoke transaction: 0x05c8e9e5bc3b6efb0a4ed467fb67a94c3445649750b304675ec895b5909931c6
3、再次调用get_name函数
starkli call 0x002d19d5de44c5d17eb6422b4aed8d1d0a1089a011ed224ae7ec85f09c017b04 get_name
返回:
[
"0x00000000000000000000000000000000000000000068656c6c6f6d7962616279"
]4、解析
starkli parse-cairo-string 0x68656c6c6f6d7962616279
得到:
hellomybaby
修改成功!
至此,一趟全流程的合约部署体验完成。