Stylus 教程 : 部署你的第一个 Rust 智能合约

本文介绍了如何使用 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.orgyarnRust (包括 rustcrustupcargo),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
  • Foundry — 智能合约开发所需

Foundry 安装步骤:

1. 打开你的终端。

2. 使用官方安装脚本安装 Foundry:

curl -L https://foundry.paradigm.xyz | bash

3. 将 Foundry 添加到你的 shell 配置文件

安装完成后,你将看到将 Foundry 添加到你的 shell 配置文件(如 .bashrc 或 .zshrc)的说明。通常,你可以这样做:

export PATH="$HOME/.foundry/bin:$PATH"

将以上行添加到你的 ~/.bashrc 或 ~/.zshrc 文件中,然后重新加载你的 shell:

source ~/.bashrc
source ~/.zshrc

4. 安装 Foundry 二进制文件

foundryup

版本要求

确保你的工具已准备好使用:

检查你的版本 — ⚠️ 必须使用 WSL 终端运行这些命令

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

你将获得可用的合约。让我们解释一下下面的合约:

在你的收件箱中获取 Esther Oche 的故事

免费加入 Medium 以获取这位作者的更新。

让我们把它分解成简单的部分:

目的

此合约复制了一个简单的 Solidity Counter 合约,但使用 RustStylus SDK

Solidity 版本

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 兼容性的注释。

no_std & 条件编译

##![cfg_attr(not(any(test, feature = "export-abi")), no_main)]
##![cfg_attr(not(any(test, feature = "export-abi")), no_std)]
  • no_std: Stylus 合约部署在一个非常小的环境中,因此它们不使用标准的 Rust 库。
  • 这些行确保合约只在特定条件下(如导出 ABI 或测试)使用 main 或标准库进行编译。

导入和 SDK 设置

##[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 设置为一个新值。

mul_number

pub fn mul_number(&mut self, new_number: U256) {
    self.number.set(new_number * self.number.get());
}

将当前的 number 乘以给定的值。

add_number

pub fn add_number(&mut self, new_number: U256) {
    self.number.set(new_number + self.number.get());
}

将给定的值加到 number 上。

increment

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 开始。
  • 递增到 1。
  • 加 3 → 变为 4。
  • 乘以 2 → 变为 8。
  • 显式设置为 100。
  • 模拟一个带有 2 wei 的交易,调用 add_from_msg_value → 变为 102。

总结

这个 Stylus 智能合约:

  • 用 Rust 重新实现了一个简单的 Solidity 合约。
  • 使用 Stylus SDK 来管理以太坊风格的存储和 U256 类型。
  • 由于 ABI 等效性,支持从 Solidity 和 Rust 调用。
  • 展示了如何使用存储、调用参数和测试。

接下来你可以做什么

1. 导出 ABI

要从 Solidity 使用合约或通过像 Ethers.js 这样的 SDK 调用它:

cargo stylus export-abi

这会生成一个与 Solidity 兼容的 ABI JSON 文件。

在本地运行

要在本地运行合约(例如,使用测试逻辑):

cargo test

或者如果设置了主二进制文件,则运行它:

cargo run

检查你的合约是否可以部署

cargo stylus check

部署到 Arbitrum 测试网

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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
estheraladioche569
estheraladioche569
江湖只有他的大名,没有他的介绍。