10 个版本 (4 个破坏性更新)
0.5.0 | 2024年1月9日 |
---|---|
0.4.2 | 2023年11月29日 |
0.3.2 | 2023年11月4日 |
0.3.0 | 2023年10月30日 |
0.1.0 | 2023年9月3日 |
#2478 in 魔法豆
每月116次 下载
34KB
615 行
SmartDeploy
Soroban 智能合约发布、开发、部署和升级的框架。
你可以将其视为智能合约的包管理器。
考虑以下合约
#![no_std]
use soroban_sdk::{self, contract, contractimpl};
#[contract]
pub struct ContractA;
#[contractimpl]
impl ContractA {
pub fn add(x: u32, y: u32) -> u32 {
x.checked_add(y).expect("no overflow")
}
}
smartdeploy_sdk::core_riff!();
最后一行 smartdeploy_sdk::core_riff
确保合约可重新部署。
构建后,您可以发布合约
smartdeploy call smartdeploy --fee 10000 -- \
publish \
--contract-name contract-a \
--wasm-file-path .../contract_a.wasm \
--author default
这直接调用智能合约并调用 publish
方法。它还使用 --wasm-file-path
读取文件的字节作为参数。
要部署,您可以使用 deploy 子命令,正如我们稍后将要看到的,它创建一个 CLI 接口,用于在部署的同一次事务中调用合约的定制初始化函数。
smartdeploy deploy --published-name contract_a \
--deployed-name contract_a \
--source default
现在假设我们还有一个名为 b 的第二个合约
#![no_std]
use soroban_sdk::{self, contract, contractimpl, Address, Env};
smartdeploy_sdk::import_contract!(contract_a);
#[contract]
pub struct ContractB;
#[contractimpl]
impl ContractB {
/// Add two numbers using the `add` method of ContractA.
pub fn add_with(env: Env, contract_id: Address, x: u32, y: u32) -> u32 {
contract_a::Client::new(&env, &contract_id).add(&x, &y)
}
}
smartdeploy_sdk::core_riff!();
我们可以“安装”合约_a,然后引用它以创建一个客户端
smartdeploy install contract_a
现在,import_contract
宏允许您以与依赖常规 Rust 依赖项相同的方式导入合约。
smartdeploy_sdk::import_contract!(contract_a);
...
contract_a::Client::new(&env, &contract_id).add(&x, &y)
现在构建合约,因为合约_a 已添加到 target/smartdeploy/contract_a/index.wasm
soroban contract build --package contract-b
发布和部署 contract_b
后,让我们更进一步,创建第三个合约。
#![no_std]
use soroban_sdk::{self, contract, contractimpl, symbol_short, Env, Symbol};
smartdeploy_sdk::import_contract!(contract_a);
smartdeploy_sdk::import_contract!(contract_b);
#[contract]
pub struct ContractC;
const KEY: &Symbol = &symbol_short!("KEY");
fn default_value(env: &Env) -> u32 {
env.storage().instance().get(KEY).unwrap_or_default()
}
#[contractimpl]
impl ContractC {
/// Initialize the contract with a number to be used as the default value.
pub fn init(env: Env, num: u32) {
if !env.storage().instance().has(KEY) {
env.storage().instance().set(KEY, &num);
}
}
/// Add two numbers using the `add` method of ContractA.
pub fn add_with(env: Env, x: u32, y: Option<u32>) -> u32 {
contract_b::new(&env).add_with(
&contract_a::address(&env),
&x,
&y.unwrap_or_else(|| default_value(&env)),
)
}
}
smartdeploy_sdk::core_riff!();
我们还需要安装 contract_b
smartdeploy install contract_b
这也会添加一个包含合约 ID 的 target/smartdeploy/contract_b/contract_id.txt
文件。有了合约的 ID,我们可以直接创建客户端,无需跟踪合约 ID。
contract_b::new(&env)
并且我们可以直接访问地址
contract_a::address(&env)
这对于Oracle合约或任何希望开发者在其合约中调用的合约来说,非常方便。
您还会注意到这个合约有一个init方法。目前使用soroban CLI,您无法一步部署和调用合约。但使用smartdeploy可以!
就像soroban CLI的出色功能一样,smartdeploy为要部署的合约生成一个CLI。您可以使用--help
来访问可能的方法。
smartdeploy deploy --published-name contract_c \
deployed-name c3pO \
--source default \
-- \
--help
smartdeploy deploy --published-name contract_c --deployed-name c3pO -- --help
Usage: c3pO [COMMAND]
Commands:
add_with
owner_get Returns the owner of the contract
owner_set Sets the owner of the contract. If one already set it transfers it to the new owner, if signed by owner.
redeploy Redeploy the contract to a wasm hash
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
smartdeploy deploy --published-name contract_c \
deployed-name c3pO \
--source default \
-- \
init --num 41
现在我们可以使用smartdeploy call
来调用合约,并省略--y
参数,它应该默认为41
。
smartdeploy call c3pO -- add_with --x 1
42
这个调用创建了对contract_b
的跨合约调用,然后调用contract_a
。无需手动引用任何合约ID!
smartdeploy也是一个Dapp!
请在这里查看:launch.smartdeploy.dev。
它目前允许您查看所有已发布的合约
部署它们
并查看所有已部署的合约
即将推出
- 自动生成init方法输入表,就像您使用CLI部署时一样。
- 为任何已部署合约的方法自动生成表单(不仅限于已部署的smartdeploy)!
- 索引将允许dapp让您快速搜索合约,就像crates.io一样。
入门指南
smartdeploy背后的关键思想是合约应该是可重新部署和可维护的。为了解决这个问题,smartdeploy允许发布合约二进制文件和一组原语,以确保合约可以重新部署。
smartdeploy-sdk
首先,您需要将smartdeploy-sdk添加到合约的Cargo.toml
文件中。
cargo add smartdeploy-sdk
soroban-cli
目前,smartdeploy依赖于CLI的不稳定版本。
cargo install soroban-cli --version 20.0.0-rc4
接下来,您需要将以下行添加到您的合约中
smartdeploy_sdk::core_riff!();
这将在您的合约中添加三个方法:owner_set
、owner_get
和redeploy
。在部署合约后,您必须使用您的账户调用owner_set
,以便您可以调用redploy
,并提供已安装合约的哈希值(下一节将提供更多信息)。
然而,在开发过程中,这可能会很繁琐,因此还有一个dev_deploy
。
smartdeploy::dev_deploy!();
这将在您的合约中添加方法dev_deploy
。这允许您仅使用wasm二进制文件重新部署合约。但是,它不打算在公共网络上使用,因为任何人都可以调用它。
因此,假设您选择后者,在最初部署合约后,您将获得一个合约ID,例如CA5YTYGCKWYJW7P3JNSMVKV2HRN4TOFMZ2VW4AQ5WQS4P3BGHNOU3PPX
。
然后,在修改合约后,您可以使用以下方式重新部署
soroban contract invoke --id CA5YTYGCKWYJW7P3JNSMVKV2HRN4TOFMZ2VW4AQ5WQS4P3BGHNOU3PPX \
--network <standalone/futurenet> \
--fee 1000000 \
--source <address or name of identity> \
-- \
dev_deploy --wasm-file-path <path/to/contarct.wasm>
这使用了新添加到合约生成的CLI中的--<arg>-file-path
参数,允许您将文件作为合约方法的输入传递。也使用了--fee
,因为默认值是100,这可能不足以包含合约的字节。
smartdeploy背后的另一个核心思想是合约可以被发布,以便任何人都可以部署其实例。这意味着这个费用只由合约发布者支付。
注意,您还可以在调用invoke
的同一目录中使用.env
文件来设置CLI参数。例如,
SOROBAN_NETWORK=standalone
SOROBAN_ACCOUNT=default
SOROBAN_FEE=1000000
使用Loam-SDK
SmartDeploy CLI
安装
cargo install smartdeploy-cli
目前,smartdeploy CLI 包含一个 install
和 call
子命令,允许您在调用已部署合约时使用合约名称。
cargo run -- call smartdeploy -- --help
可以列出已部署合约
cargo run -- call smartdeploy -- list_deployed_contracts
依赖项
~52–73MB
~1.5M SLoC