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
404 下载/月
用于 6 crates
13KB
108 行
loam-sdk
构建 可组合的、可升级的、安全的 智能合约。
-
可组合的:使用Loam SDK,您可以从许多 子 合约中组合您的智能合约。子合约就像乐高积木,您可以从开源生态系统直接使用,或者自行构建。单个Loam 智能 合约由一个或多个子合约组成。
-
可升级的:所有Loam智能合约都必须包含的一个子合约(loam-subcontract-core)为智能合约添加了一个重要方法:
redeploy
。您可以通过调用此方法将wasm
哈希(合约的行为/大脑)切换到新的,同时保持相同的合约ID。每个特定子合约访问的存储是懒加载数据,因此升级一个子合约不需要迁移另一个子合约的数据;您可以在智能合约内独立考虑和升级每个子合约。 -
安全的:核心子合约 还为您的合约添加了
admin_set
和admin_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_set
、admin_get
、redeploy
)。但是,如果需要,您也可以通过用不同的结构体/枚举替换 Admin
来提供不同的实现,这些结构体/枚举也实现了 IsCore。
请注意,生成的代码包括 Contract::redeploy
和其他方法。这确保了 Contract
类型是可重部署的,同时允许扩展,因为不同的具体实现可以覆盖默认方法。
依赖关系
~12–16MB
~336K SLoC