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 在 神奇豆子
710 每月下载量
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 koba
将 koba
添加到您的项目中,将其用作库。
用法
您可以通过两种方式使用命令行界面:使用 generate
和 deploy
命令。
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-5656
的MCOPY
指令。截至 2024-05-28,nitro-testnode
不支持此指令。
为什么选择 koba
koba
在日语中意为 工厂,即笔尖组装的工厂。
依赖项
~34–50MB
~1M SLoC