Stylus Rust SDK 介绍

209 阅读3分钟

最近在跟着 HackQuest 学习 web3 相关的知识

这是一个适合所有人的 web3 编程平台

image.png

大纲

image.png

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 个字节。