最近在跟着 HackQuest 学习 web3 相关的知识
这是一个适合所有人的 web3 编程平台
大纲
Stylus Rust SDK
Stylus Rust SDK 使智能合约开发人员能够用 Rust 在 Arbitrum 上编写智能合约。 Stylus 程序被编译为 WebAssembly (WASM), 然后部署在链上,并且可以与 Solidity 智能合约一起执行。Stylus 程序不仅便宜、速度快几个数量级,而且还实现了以前认为 WebAssembly 不可能实现的功能:EVM 互操作性。
亮点
该 SDK 可以轻松地在 Rust 中开发与以太坊等效的 Stylus 合约。它提供了一整套与 Solidity 对应的数据类型和快捷方式,抽象了 Solidity 存储布局的细节,使编写 Rust 变得很容易。
SDK 中提供的一些功能包括:
- 提供了通用的、支持 Storage 的 Rust 类型,可用于编写与 Solidity 等效的智能合约。
- 用于编写与语言无关的方法和入口点的简单宏。
- 自动导出 Solidity 接口以实现跨编程语言的互操作性。
- 由功能丰富的 Alloy (一组支持 Rust 以太坊生态系统的 crate 库集合)所支持的强大的原始类型。
Stylus Rust SDK 智能合约
use stylus_sdk::{alloy_primitives::U256, prelude::*};
// Generate Solidity-equivalent, Rust structs backed by storage.
sol_storage! {
#[entrypoint]
pub struct Counter {
uint256 number;
}
}
#[external]
impl Counter {
// Gets the number value from storage.
pub fn number(&self) -> Result<U256, Vec<u8>> {
Ok(self.number.get())
}
// Sets a number in storage to a user-specified value.
pub fn set_number(&mut self, new_number: U256) -> Result<(), Vec<u8>> {
self.number.set(new_number);
Ok(())
}
}
- 第1部分是 Storage 的定义,这里使用 number 变量定义合约的状态
- 第2部分是 Method,实现对存储的读写操作。
●use stylus_sdk::{ ...} : 这行代码导入了 Stylus SDK 的预定义模块和类型。
●sol_storage! { ... }: 这是一个宏调用,用于生成 Solidity 合约的等效 Rust 结构体,并实现存储的定义。
●#[entrypoint]: 这个属性宏用于标记一个入口点结构体或函数,它定义了 Stylus 执行的开始位置, 它通常在顶级结构之前使用(在本例中为Counter)。
●pub struct Counter { ... }: 这是一个公共结构体定义,定义了一个名为 Counter 的结构体,代表了智能合约的状态。在这个结构体中,有一个名为 number 的 uint256 类型的存储变量。
●#[external] impl Counter { ... }: 这个块是 Counter 结构体的外部实现部分,标记了所有可供外部调用的方法。
●number(): 这是一个公共方法,用于从存储中获取 number 的值。它返回一个 Result 类型,其中包含一个 U256 类型的成功值(存储中的 number 值),或者一个 Vec 类型的错误消息。
●set_number(): 这是另一个公共方法,用于设置存储中的 number 值为用户指定的新值。它接受一个 U256 类型的新值作为参数,并返回一个 Result 类型,其中包含一个空的成功值,或者一个 Vec 类型的错误消息。
Stylus Rust SDK 中的 Storage
在 Stylus Rust SDK 中,由两种宏来定义和使用存储: #[solidity_storage] 和 sol_storage!, 这里先介绍第一种, 使用 #[solidity_storage] 声明状态变量来使用 Storage.
#[solidity_storage]
pub struct Counter {
number: StorageU256;
}
该合约的存储中只有一个状态变量 number, 为 StorageU256 类型,占用 32 个字节。