开发环境安装
rust
1 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y |
我是用的 mise 工具来安装的1
mise install rust@1.92.0
Stylus CLI
Arbitrum 的开发框架1
cargo install cargo-stylus
因为 Arbitrum 的合约程序最终会被编译为 webassembly,所以还需要安装 wasm 相关的编译工具
1 | rustup target add wasm32-unknown-unknown |
foundry
foundry 是一个 EVM 智能合约开发测试的工具。
下载 foundry 相关的命令行工具: https://github.com/foundry-rs/foundry/releases
solc
下载 solc 的二进制文件: https://github.com/argotorg/solidity/releases
本地开发结点
需要先安装 docker 环境1
2
3git clone https://github.com/OffchainLabs/nitro-devnode.git
cd nitro-devnode
./run-dev-node.sh
本地结点的账号、密钥:1
2Address: 0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E
Private key: 0xb6b15c8cb491557369f3c7d2c287b053eb229daa9c22138887752191c9520659
如果想要外部也能够连接本地的结点,那么需要修改一个 run-dev-node.sh 这个脚本,在 docker run 这条命令后面再加上 --http.vhosts=* 参数。
开发流程
创建项目
1 | cargo stylus new <name> |
编译
1 | cargo stylus build |
编译成功会生成 target/wasm32-unknown-unknown/release/xxx.wasm 文件
部署
验证是否能够部署1
cargo stylus check -e http://127.0.0.1:8547
仅计算部署所需的 gas 费1
2
3
4cargo stylus deploy \
--endpoint=http://127.0.0.1:8547 \
--private-key=<YOUR_PRIVATE_KEY> \
--estimate-gas-only
部署合约1
2
3cargo stylus deploy \
--endpoint=http://127.0.0.1:8547 \
--private-key=<YOUR_PRIVATE_KEY>
导出合约 contract ABI,需要先安装 solc1
cargo stylus export-abi --output=./abi.json --json
合约测试
调用合约程序查询数据:
1 | cast call --rpc-url http://127.0.0.1:8547 <合约地址> "合约函数签名" [<函数参数>] |
例如,对于一个 ERC20 的程序,查询账户余额:1
cast call --rpc-url $ARB_RPC_URL $CONTRACT_TOKEN "balanceOf(address)(uint256)" $PUBLIC_KEY
调用合约创建交易:
1 | cast send --rpc-url http://127.0.0.1:8547 --private-key <自己的私钥> <合约地址> "合约函数签名" [<函数参数>] |
例如,一个 ERC20 的转账操作:1
cast send --rpc-url $ARB_RPC_URL --private-key $PRIVATE_KEY $CONTRACT_TOKEN "transfer(address, uint256)" $TARGET_ADDRESS $AMOUNT