#deployment #stylus #ethereum #arbitrum #rust

bin+lib koba

使用 Solidity 构造函数部署 Stylus 合同

5 个不稳定版本

0.2.0 2024 年 8 月 6 日
0.1.2 2024 年 7 月 15 日
0.1.1 2024 年 7 月 15 日
0.1.0 2024 年 6 月 18 日
0.0.1 2024 年 6 月 3 日

#334神奇豆子

Download history 135/week @ 2024-06-02 13/week @ 2024-06-09 446/week @ 2024-06-16 208/week @ 2024-06-23 127/week @ 2024-06-30 151/week @ 2024-07-07 407/week @ 2024-07-14 119/week @ 2024-07-21 122/week @ 2024-07-28 277/week @ 2024-08-04 177/week @ 2024-08-11

710 每月下载量

MIT 许可证

60KB
1.5K SLoC

koba (工場)

生成 Stylus 合同的部署事务数据。

[!警告] 此项目仍处于非常早期和实验阶段。它从未经过审计或彻底的安全漏洞审查。请勿在生产环境中使用。

此项目旨在临时使用。它解决的问题应该由 cargo-stylus 本身或在 Stylus VM 中解决。因此,我们以最大努力维持该项目。

为什么?

Ethereum 中的部署事务由三个部分组成

  • A prelude - 由部署事务触发的字节码前缀。
  • A runtime - 存储在链上的智能合约的字节码。
  • 构造函数参数 - 构造函数接收的 ABI 编码参数。

Stylus 不支持仅输入压缩 wasm 的部署事务。也就是说,只有 runtime 是实际的 WebAssembly。

此外,使用 cargo-stylus 的部署事务的前缀是 硬编码的

koba 允许与 Stylus 合同一起使用 Solidity 构造函数,使用户能够以熟悉的方式部署他们的代码。

koba 可以作为 CLI 工具或作为 Rust 项目的库使用。有关以下部分以外的使用示例,请参阅 OpenZeppelin Stylus 合同

安装

要在您的计算机上安装 koba,只需运行

cargo install koba

使用 koba 编译 Solidity 代码需要安装并可通过命令行访问 solc

您还可以通过使用 cargo add kobakoba 添加到您的项目中,将其用作库。

用法

您可以通过两种方式使用命令行界面:使用 generatedeploy 命令。

koba generate

对于这样的合约

sol_storage! {
    #[entrypoint]
    pub struct Counter {
        uint256 number;
    }
}

#[external]
impl Counter {
    pub fn number(&self) -> U256 {
        self.number.get()
    }

    pub fn increment(&mut self) {
        let number = self.number.get();
        self.set_number(number + U256::from(1));
    }
}

具有这样的构造函数

contract Counter {
    uint256 private _number;

    constructor() {
        _number = 5;
    }
}

以下命令会输出部署合约所需的交易数据。

$ koba generate --sol <path-to-constructor> --wasm <path-to-wasm>
6080604052348015600e575f80fd5b...d81f197cb0f070175cce2fd57095700201

然后您可以使用 cast 等工具来部署并激活合约,例如

# Deploy the contract.
cast send --rpc-url https://stylusv2.arbitrum.io/rpc --private-key <private-key> --create <koba output>

# Activate the contract.
cast send --rpc-url https://stylusv2.arbitrum.io/rpc --private-key <private-key> --value "0.0001ether" 0x0000000000000000000000000000000000000071 "activateProgram(address)(uint16,uint256)" <contract address>

# Interact with the contract
cast call --rpc-url https://stylusv2.arbitrum.io/rpc <contract address> "number()"
0x0000000000000000000000000000000000000000000000000000000000000005

cast send --rpc-url https://stylusv2.arbitrum.io/rpc --private-key <private-key> <contract address> "increment()"

cast storage --rpc-url https://stylusv2.arbitrum.io/rpc <contract address> 0
0x0000000000000000000000000000000000000000000000000000000000000006

koba deploy

对于上一节中的相同代码,您也可以直接运行带有适当参数的 koba deploy,一次部署并激活您的 Stylus 合约

$ koba deploy --sol <path-to-constructor> --wasm <path-to-wasm> --args <constructor-arguments> -e https://stylusv2.arbitrum.io/rpc --private-key <private-key>
wasm data fee: Ξ0.000113
init code size: 20.8 KB
deploying to RPC: https://stylusv2.arbitrum.io/rpc
deployed code: 0x470AE56DFbea924722423926782D8aB30f108A49
deployment tx hash: 0xb52a68b973fb883dbef6bf3e0cbee4f02608ae71ad5a89f6a2f0c9f094242a5b
activated with 2987042 gas
activation tx hash: 0x40086445e80365b648621fd62d978d716708fe05144f303baa620086eda854d1
success!

限制

  • immutable 变量 - 目前 koba 不支持 Solidity 的 immutable 变量,因为 Stylus 中没有等效的机制。
  • MCOPY - Solidity 的 0.8.24 版本引入了来自 EIP-5656MCOPY 指令。截至 2024-05-28,nitro-testnode 不支持此指令。

为什么选择 koba

koba 在日语中意为 工厂,即笔尖组装的工厂。

依赖项

~34–50MB
~1M SLoC