#contract #sdk #smartdeploy #ensure #soroban #help #redeployed

smartdeploy-sdk

SmartDeploy SDK帮助确保soroban合约可重新部署

6个版本

0.1.5 2023年11月29日
0.1.4 2023年11月17日
0.1.2 2023年10月30日
0.1.1 2023年9月24日

#1591神奇豆

Download history 115/week @ 2024-03-15 8/week @ 2024-03-29 2/week @ 2024-04-05 6/week @ 2024-04-12 4/week @ 2024-04-19

每月73次下载
core-riff 中使用

Apache-2.0

11KB

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
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

这也添加了一个 target/smartdeploy/contract_b/contract_id.txt 文件,其中包含合约的ID。有了合约的ID,我们就可以直接创建客户端,而无需追踪合约ID

contract_b::new(&env)

我们还可以直接使用地址

contract_a::address(&env)

这对于甲骨文合约或任何希望开发者在合约中调用的合约来说非常方便。

您还会注意到,此合约有一个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

目前它让您可以看到所有已发布的合约

image

部署它们

image

并查看所有已部署的合约

image

即将推出

  • 自动生成类似于 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_setowner_getredeploy。部署您的合约后,您必须调用 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 有 installcall 子命令,允许您在调用时使用已部署合约的名称。

cargo run -- call smartdeploy -- --help

可以列出已部署的合约

cargo run -- call smartdeploy -- list_deployed_contracts

依赖项

~1–1.8MB
~38K SLoC