6 个版本

0.1.6 2024 年 7 月 4 日
0.1.5 2023 年 9 月 19 日
0.1.3 2023 年 8 月 31 日

4#arbitrum

每月 36 次下载

MIT/Apache

375KB

Image

Stylus Hello World

使用 stylus-sdk 编写 Arbitrum Stylus 程序的起始模板。它包含一个基本的计数 Ethereum 智能合约的 Rust 实现。

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
        number = newNumber;
    }

    function increment() public {
        number++;
    }
}

要设置更简洁的示例,同时仍然使用 Stylus SDK,请在 OffchainLabs/cargo-stylus 下使用以下 cargo stylus new --minimal <YOUR_PROJECT_NAME>

快速入门

安装 Rust,然后使用 Cargo 安装 Stylus CLI 工具

cargo install --force cargo-stylus cargo-stylus-check

wasm32-unknown-unknown 编译目标添加到您的 Rust 编译器

rustup target add wasm32-unknown-unknown

现在,它应该可以作为 Cargo 子命令使用

cargo stylus --help

然后,克隆模板

git clone https://github.com/OffchainLabs/stylus-hello-world && cd stylus-hello-world

测试网信息

所有测试网信息,包括水龙头和 RPC 端点,都可以在这里找到 这里

ABI 导出

您可以使用以下 cargo stylus 工具导出您程序的 Solidity ABI

cargo stylus export-abi

输出如下

/**
 * This file was automatically generated by Stylus and represents a Rust program.
 * For more information, please see [The Stylus SDK](https://github.com/OffchainLabs/stylus-sdk-rs).
 */

interface Counter {
    function setNumber(uint256 new_number) external;

    function increment() external;
}

导出 ABIs 使用的是默认在您的 Cargo.toml 中启用的功能

[features]
export-abi = ["stylus-sdk/export-abi"]

部署

您可以使用 cargo stylus 命令将您的程序部署到 Stylus 测试网。我们可以使用此工具首先检查我们的程序是否编译为有效的 Stylus WASM,并且可以在链上成功部署而无需交易。默认情况下,这将使用 Stylus 测试网公共 RPC 端点。有关 Stylus 测试网信息,请参阅此处

cargo stylus check

如果成功,您应该看到

Finished release [optimized] target(s) in 1.88s
Reading WASM file at stylus-hello-world/target/wasm32-unknown-unknown/release/stylus-hello-world.wasm
Compressed WASM size: 8.9 KB
Program succeeded Stylus onchain activation checks with Stylus version: 1

接下来,我们可以在发送交易之前估计部署和激活我们程序的gas费用。查看cargo-stylus的README,了解这一步的不同钱包选项。

cargo stylus deploy \
  --private-key-path=<PRIVKEY_FILE_PATH> \
  --estimate-gas-only

然后您将看到交易前的部署估计gas费用。

Deploying program to address e43a32b54e48c7ec0d3d9ed2d628783c23d65020
Estimated gas for deployment: 1874876

上述内容默认仅估计部署交易的gas费用。要估计激活的gas费用,首先使用--mode=deploy-only部署您的程序,然后运行带有--estimate-gas-only标志的cargo stylus deploy,使用--mode=activate-only,并指定--activate-program-address

以下是部署的方法

cargo stylus deploy \
  --private-key-path=<PRIVKEY_FILE_PATH>

CLI会发送2个交易来在链上部署和激活您的程序。

Compressed WASM size: 8.9 KB
Deploying program to address 0x457b1ba688e9854bdbed2f473f7510c476a3da09
Estimated gas: 1973450
Submitting tx...
Confirmed tx 0x42db…7311, gas used 1973450
Activating program at address 0x457b1ba688e9854bdbed2f473f7510c476a3da09
Estimated gas: 14044638
Submitting tx...
Confirmed tx 0x0bdb…3307, gas used 14044638

一旦这两个步骤都成功完成,您就可以像与任何以太坊智能合约一样与您的程序交互。

调用您的程序

此模板包含了一个使用ethers-rsexamples/counter.rs中调用和与您的程序进行交易Rust的示例。然而,如果使用Stylus SDK,您的程序也是Ethereum ABI等价的。 它们可以用任何其他Ethereum工具进行调用和交易。

使用您上述部署步骤中的程序地址和您的钱包,您可以尝试调用计数程序并增加其存储中的值。

abigen!(
    Counter,
    r#"[
        function number() external view returns (uint256)
        function setNumber(uint256 number) external
        function increment() external
    ]"#
);
let counter = Counter::new(address, client);
let num = counter.number().call().await;
println!("Counter number value = {:?}", num);

let _ = counter.increment().send().await?.await?;
println!("Successfully incremented counter via a tx");

let num = counter.number().call().await;
println!("New counter number value = {:?}", num);

要运行它,设置以下环境变量或将它们放置在此项目的.env文件中,然后

STYLUS_PROGRAM_ADDRESS=<the onchain address of your deployed program>
PRIV_KEY_PATH=<the file path for your priv key to transact with>
RPC_URL=https://stylus-testnet.arbitrum.io/rpc

接下来,运行

cargo run --example counter --target=<YOUR_ARCHITECTURE>

您可以通过运行rustc -vV | grep host找到YOUR_ARCHITECTURE。例如,对于M1苹果电脑,这是aarch64-apple-darwin,而对于大多数Linux x86,这是x86_64-unknown-linux-gnu

构建选项

默认情况下,cargo stylus工具会使用合理的优化为WASM构建您的项目,但您可以通过查看cargo stylus的完整README来控制编译过程。如果您想优化编译的WASM的大小,请查看这里提供的不同选项(在此处)

深入了解

stylus-sdk包含许多功能,用于使用Rust编写Stylus程序。它还提供了有助于Solidity开发者的宏,使体验更容易。这些宏将您的代码扩展为纯Rust代码,然后可以将其编译为WASM。如果您想查看stylus-hello-world模板扩展成什么样子,可以使用cargo expand查看将要部署到链上的纯Rust代码。

首先,如果您还没有子命令,运行cargo install cargo-expand,然后

cargo expand --all-features --release --target=<YOUR_ARCHITECTURE>

在运行以下命令后,您可以找到 YOUR_ARCHITECTURErustc -vV | grep host。例如,对于 M1 Apple 电脑,这将是 aarch64-apple-darwin

许可证

本项目完全开源,包括您自行选择在您自己的版权下的 Apache-2.0 或 MIT 许可证。

依赖项

~12MB
~203K SLoC