本文介绍了如何使用 Rust 和 Stylus SDK 在 Arbitrum Stylus 上部署智能合约。文章逐步讲解了环境配置、合约代码结构(包括存储、函数等),并提供了测试、导出 ABI 以及部署到 Arbitrum 测试网的命令。内容涵盖了从 Solidity 到 Rust 的 Counter 合约的转换,以及使用 Stylus SDK 进行开发的关键步骤。
在这一课中,我将讨论如何部署你的第一个 Stylus 合约。下面是一个 Rust 代码,它是一个 Stylus 智能合约,设计用于在 Arbitrum Stylus 上运行。Arbitrum Stylus 是一个新的虚拟机,允许使用 Rust(而不是 Solidity)编写智能合约,并与以太坊工具兼容。
安装 Rust
为 Rust 添加对 webAssembly 编译目标的支持
rustup target add wasm32-unknown-unknown
安装 Cargo,一个用于 Rust 的包管理的命令行工具。因此,让我们安装 Stylus 脚本
cargo install cargo-stylus
检查你是否可以访问 cargoe CLI 命令
cargo stylus help
如果你没有安装 Node.js,请访问 node.js.org,yarn,Rust (包括 rustc
、rustup
和 cargo
),Ubuntu 上的 Curl,确保你完成了这些,然后安装包管理器:
npm install -y
安装 assembly script
npm install --save-dev assemblyscript
创建 assembly 项目
npx asinit .
cargo-stylus
-> 使用以下命令安装 cargo-stylus:
cargo install cargo-stylus
对于 Ubuntu 用户,你也可以运行这个
sudo apt update
sudo apt install pkg-config
sudo apt install libssl-dev
sudo apt install build-essential
curl -L https://foundry.paradigm.xyz | bash
安装完成后,你将看到将 Foundry 添加到你的 shell 配置文件(如 .bashrc 或 .zshrc)的说明。通常,你可以这样做:
export PATH="$HOME/.foundry/bin:$PATH"
将以上行添加到你的 ~/.bashrc 或 ~/.zshrc 文件中,然后重新加载你的 shell:
source ~/.bashrc
source ~/.zshrc
foundryup
确保你的工具已准备好使用:
cargo stylus --version
cargo --version
rustup --version
rustc --version
curl --version
cast --version
forge --version
## Install cargo-stylus
cargo install cargo-stylus
rustup target add wasm32-unknown-unknown
## Create a new project
cargo stylus new my-contract
你将获得可用的合约。让我们解释一下下面的合约:
免费加入 Medium 以获取这位作者的更新。
让我们把它分解成简单的部分:
此合约复制了一个简单的 Solidity Counter
合约,但使用 Rust 和 Stylus SDK。
contract Counter {
uint256 public number;
function setNumber(uint256 newNumber) public {
number = newNumber;
}
function increment() public {
number++;
}
}
现在让我们解释一下 Rust/Stylus 版本:
//! Stylus Hello World
//! The following contract implements the Counter example from Foundry.
//! ...
这些是文档注释。它们描述了文件正在做什么,包括对原始 Solidity 版本的引用和关于 ABI 兼容性的注释。
##![cfg_attr(not(any(test, feature = "export-abi")), no_main)]
##![cfg_attr(not(any(test, feature = "export-abi")), no_std)]
no_std
: Stylus 合约部署在一个非常小的环境中,因此它们不使用标准的 Rust 库。main
或标准库进行编译。##[macro_use]
extern crate alloc;
use alloc::vec::Vec;
use stylus_sdk::{alloy_primitives::U256, prelude::*};
alloc
用于代替标准库来管理内存。U256
是以太坊的无符号 256 位整数(在 Solidity 中使用)。prelude::*
导入有用的 Stylus 特性和宏。sol_storage! {
#[entrypoint]
pub struct Counter {
uint256 number;
}
}
Counter
的合约。number
为一块持久存储(类似于 Solidity 中的 uint256 number
)。#[entrypoint]
意味着这是用户将与之交互的主要合约。##[public]
impl Counter {
#[public]
宏将以下函数暴露给区块链。让我们逐一介绍:
number
pub fn number(&self) -> U256 {
self.number.get()
}
读取 number
的当前值。
set_number
pub fn set_number(&mut self, new_number: U256) {
self.number.set(new_number);
}
将 number
设置为一个新值。
pub fn mul_number(&mut self, new_number: U256) {
self.number.set(new_number * self.number.get());
}
将当前的 number
乘以给定的值。
pub fn add_number(&mut self, new_number: U256) {
self.number.set(new_number + self.number.get());
}
将给定的值加到 number
上。
pub fn increment(&mut self) {
let number = self.number.get();
self.set_number(number + U256::from(1));
}
将 number
增加 1。
add_from_msg_value
##[payable]
pub fn add_from_msg_value(&mut self) {
let number = self.number.get();
self.set_number(number + self.vm().msg_value());
}
msg.value
(随调用一起发送的 ETH)加到 number
上。#[payable]
将函数标记为能够接收价值转移。##[cfg(test)]
mod test {
...
}
此模块使用 Stylus 的内置测试框架运行测试。它模拟合约交互:
number = 0
开始。add_from_msg_value
→ 变为 102。这个 Stylus 智能合约:
要从 Solidity 使用合约或通过像 Ethers.js 这样的 SDK 调用它:
cargo stylus export-abi
这会生成一个与 Solidity 兼容的 ABI JSON 文件。
要在本地运行合约(例如,使用测试逻辑):
cargo test
或者如果设置了主二进制文件,则运行它:
cargo run
检查你的合约是否可以部署
cargo stylus check
cargo stylus deploy --private-key-path=/path/to/key.txt --endpoint="https://sepolia-rollup.arbitrum.io/rpc"
## Export contract ABI
cargo stylus export-abi --output=./abi.json --json
- 原文链接: medium.com/@estheraladio...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!