13个版本

新版本 0.6.14 2024年8月19日
0.6.13 2024年7月20日
0.6.10 2024年6月21日
0.6.8 2024年5月23日
0.6.2 2023年8月31日

#1 in #loam

Download history 1/week @ 2024-04-22 3/week @ 2024-04-29 154/week @ 2024-05-20 7/week @ 2024-05-27 206/week @ 2024-06-03 14/week @ 2024-06-10 125/week @ 2024-06-17 24/week @ 2024-06-24 17/week @ 2024-07-01 131/week @ 2024-07-08 259/week @ 2024-07-15 37/week @ 2024-07-22 80/week @ 2024-07-29 4/week @ 2024-08-05

404 下载/月
用于 6 crates

Apache-2.0

13KB
108

loam-sdk

构建 可组合的可升级的安全的 智能合约。

  • 可组合的:使用Loam SDK,您可以从许多 合约中组合您的智能合约。子合约就像乐高积木,您可以从开源生态系统直接使用,或者自行构建。单个Loam 智能 合约由一个或多个子合约组成。

  • 可升级的:所有Loam智能合约都必须包含的一个子合约(loam-subcontract-core)为智能合约添加了一个重要方法: redeploy。您可以通过调用此方法将 wasm 哈希(合约的行为/大脑)切换到新的,同时保持相同的合约ID。每个特定子合约访问的存储是懒加载数据,因此升级一个子合约不需要迁移另一个子合约的数据;您可以在智能合约内独立考虑和升级每个子合约。

  • 安全的核心子合约 还为您的合约添加了 admin_setadmin_get,以确保只有您的受信任管理员账户可以调用 redeploy。我们的完整的Loam架构(超出Loam SDK),还包括一个通用工厂合约,这使得您可以在单个交易中部署合约并调用 admin_set,从而帮助避免抢先交易。

  • 子合约

  • 核心

  • 使用核心子合约

子合约

子合约是一种实现了 IntoKey 特性的类型,该特性用于懒加载和存储类型。

创建子合约

以下是如何创建子合约的示例

#[contracttype]
#[derive(IntoKey)]
pub struct Messages(Map<Address, String>);

这生成了以下实现

impl IntoKey for Messages {
    type Key = IntoVal<Env, RawVal>;
    fn into_key() -> Self::Key {
      String::from_slice("messages")
    }

外部API

您还可以为合约子合约创建和实现外部API

#[subcontract]
pub trait IsPostable {
    fn messages_get(&self, author: Address) -> Option<String>;
    fn messages_set(&mut self, author: Address, text: String);
}

核心子合约

Core》特质提供了合约可重部署所需的最小逻辑。合约应能够被重部署到另一个也可以被重部署的合约。重部署需要管理员状态,因为在不允许的情况下,账户重部署合约是不被期望的。

使用 Core

要使用核心子合约,创建一个 Contract 结构体并使用 Admin 实现来实现 Core,这确保了合约是可重部署的,并且如果新的合约也实现了 Core,它将继续是可重部署的。在 Core 之后,可以根据需要添加其他子合约。

use loam_sdk::derive_contract;
use loam_subcontract_core::{Admin, Core};

#[derive_contract(Core(Admin))]
pub struct Contract;

此代码生成了以下实现

struct SorobanContract;

#[contractimpl]
impl SorobanContract {
     pub fn admin_set(env: Env, admin: Address) {
        set_env(env);
        Contract::owner_set(owner);
    }
    pub fn admin_get(env: Env) -> Option<Address> {
        set_env(env);
        Contract::admin_get()
    }
    pub fn redeploy(env: Env, wasm_hash: BytesN<32>) {
        set_env(env);
        Contract::redeploy(wasm_hash);
    }
    // Subcontract methods would be inserted here.
    // Contract must implement all Subcontracts and is the proxy for the contract calls.
    // This is because the Subcontracts have default implementations which call the associated type
}

通过指定与 Core 相关的具体系实现 Admin,您可以使用其方法(admin_setadmin_getredeploy)。但是,如果需要,您也可以通过用不同的结构体/枚举替换 Admin 来提供不同的实现,这些结构体/枚举也实现了 IsCore

请注意,生成的代码包括 Contract::redeploy 和其他方法。这确保了 Contract 类型是可重部署的,同时允许扩展,因为不同的具体实现可以覆盖默认方法。

依赖关系

~12–16MB
~336K SLoC