闲社服务运行正常AI智能体自动化平台
u

升级恒星合约

技能标识:upgrade-stellar-contracts

Upgrade Stellar/Soroban smart contracts using OpenZeppelin's upgradeable module. Use when users need to: (1) make Soroban contracts upgradeable via native WASM replacement, (2) use Upgradeable or UpgradeableMigratable derive macros, (3) implement atomic upgrade-and-migrate patterns with an Upgrader contract, (4) ensure storage key compatibility across upgrades, or (5) test upgrade paths for Soroban contracts.

作者:admin | 来源记录:ClawHub
登记来源
ClawHub
版本
V 1.0.1
检测标记
后台标记通过
免费
免费获取
0
收藏
来源与检测标记为平台登记信息,并不代表已展示可复核的检测报告。使用前请核对版本、依赖和所需权限,建议先在隔离环境中运行。
概述
安装方式
版本历史

升级恒星合约

Stellar 升级

目录

Soroban 升级模型

Soroban 合约默认是可变的。可变性指的是智能合约修改自身 WASM 字节码、改变其函数接口、执行逻辑或元数据的能力。Soroban 提供了一种内置的、协议级别的机制用于合约升级——无需代理模式。

如果合约被明确设计为可升级,它就可以自行升级。相反,只要不提供任何升级函数,合约就变得不可变。这与 EVM 代理模式有根本不同:

SorobanEVM(代理模式)Starknet
机制原生 WASM 字节码替换代理通过 delegatecall 调用实现合约replaceclasssyscall 原地替换类哈希
是否需要代理合约
否——合约自行升级 | 是——代理位于实现合约之前 | 否——合约自行升级 |
| 存储位置 | 直接属于合约 | 位于代理中,通过 delegatecall 访问 | 直接属于合约 |
| 选择不可变 | 不暴露升级函数 | 不部署代理 | 不调用系统调用 |

协议级别可升级性的一个优势是,与需要代理合约和 delegatecall 转发的平台相比,风险面显著降低。

新的实现仅在当前调用完成后生效。这意味着如果新实现中定义了迁移逻辑,它无法在与升级相同的调用中执行。辅助性的 Upgrader 合约可以包装这两个调用以实现原子性(见下文)。

使用 OpenZeppelin 可升级模块

OpenZeppelin Stellar Soroban 合约在 contract-utils 包中提供了一个 upgradeable 模块,包含两个主要组件:

组件使用场景
Upgradeable仅需更新 WASM 二进制文件——无需存储迁移
UpgradeableMigratable
升级期间需要修改 WASM 二进制文件和特定存储条目 |

推荐的使用方式是通过派生宏:#[derive(Upgradeable)] 和 #[derive(UpgradeableMigratable)]。这些宏处理必要函数的实现,并将 Cargo.toml 中的 crate 版本设置为 WASM 元数据中的二进制版本,符合 SEP-49 指南。

仅升级

在合约结构体上派生 Upgradeable,然后实现 UpgradeableInternal,其中包含一个必需方法:

  • - requireauth(e: &Env, operator: &Address)——验证操作者是否有权执行升级(例如,对照存储的所有者地址进行检查)

operator 参数是升级函数的调用者,可用于基于角色的访问控制。

升级并迁移

在合约结构体上派生 UpgradeableMigratable,然后实现 UpgradeableMigratableInternal,包含:

  • - 一个关联的 MigrationData 类型,定义传递给迁移函数的数据
  • requireauth(e, operator)——与上述相同的授权检查
  • _migrate(e: &Env, data: &Self::MigrationData)——使用提供的迁移数据执行存储修改

派生宏确保迁移只能在成功升级后调用,防止状态不一致和存储损坏。

原子升级和迁移

由于新实现仅在当前调用完成后生效,新合约中的迁移逻辑无法在与升级相同的调用中运行。辅助性的 Upgrader 合约以原子方式包装这两个调用:

rust
use sorobansdk::{contract, contractimpl, symbolshort, Address, BytesN, Env, Val};
use stellarcontractutils::upgradeable::UpgradeableClient;
use stellarcontractutils::access::Ownable;

#[contract]
pub struct Upgrader;

#[contractimpl]
impl Upgrader {
#[only_owner]
pub fn upgradeandmigrate(
env: Env,
contract_address: Address,
operator: Address,
wasm_hash: BytesN<32>,
migrationdata: sorobansdk::Vec,
) {
operator.require_auth();
let contractclient = UpgradeableClient::new(&env, &contractaddress);
contractclient.upgrade(&wasmhash, &operator);
env.invoke_contract::<()>(
&contract_address,
&symbol_short!(migrate),
migration_data,
);
}
}

关键——Upgrader 访问控制: Upgrader 合约必须有自己的访问控制(例如,来自 access 包的 #[onlyowner])。operator.requireauth() 调用仅证明操作者签署了交易——它不证明操作者有权升级目标合约。如果目标合约的 requireauth 信任 Upgrader 的地址(而不是原始调用者),那么如果没有对 Upgrader 本身的访问控制,任何人都可以通过它触发升级。

如果需要回滚,合约可以升级到更新版本,在该版本中定义回滚特定逻辑并作为迁移执行。

示例: 参见 stellar-contracts 仓库 的 examples/ 目录,获取 Upgradeable 和 UpgradeableMigratable 的完整工作集成示例,包括 Upgrader 模式。

访问控制

upgradeable 模块特意不嵌入访问控制本身。你必须在 UpgradeableInternal 或 UpgradeableMigratableInternal 的 requireauth 方法中定义授权。忘记这一点将允许任何人替换你的合约代码。

常见的访问控制选项:

  • - Ownable——单一所有者,最简单的模式(在 access 包中可用)
  • AccessControl / RBAC——基于角色,更细粒度(在 access 包中可用)
  • 多签或治理——用于管理重要价值的生产合约

升级安全

注意事项

该框架构建了升级流程,但不执行更深层次的检查:

  • - 新合约的构造函数将不会被调用——任何初始化必须通过迁移或单独调用进行
  • 没有自动检查新合约是否包含升级机制——升级到没有升级机制的合约将永久失去可升级性
  • 存储一致性未经验证——新合约可能无意中引入存储不匹配

存储兼容性

替换 WASM 二进制文件时,现有存储将由新代码重新解释。不兼容的更改会破坏状态:

  • - 不要删除或重命名现有存储键
  • 不要更改现有键下存储的值的类型
  • 添加新的存储键是安全的
  • Soroban 存储使用显式字符串键(例如 symbol_short!(OWNER)),因此键命名至关重要——与 EVM 顺序插槽不同,这里没有顺序依赖关系

版本追踪

派生宏自动从 Cargo.toml 中提取 crate 版本,并将其作为二进制版本嵌入 WASM 元数据中,遵循 SEP-49。这实现了链上版本追踪,可用于协调升级路径。

测试升级路径

在升级生产合约之前:

  • - [ ] 在本地 Soroban 测试网上部署 V1(例如,使用本地网络的 stellar-cli)
  • [ ] 使用 V1 写入状态,升级到 V2,并验证所有现有状态读取正确
  • [ ] 验证新功能在升级后按预期工作
  • [ ] 确认访问控制——只有授权的调用者才能调用 upgrade
  • [ ] 检查 V2 是否包含升级机制——否则可升级性将永久丢失
  • [ ] 验证存储键兼容性——确保没有删除、重命名或更改现有键的类型
  • [ ] 使用 Upgrader 模式测试原子升级和迁移(如果需要迁移)
  • [ ] 手动审查——Soroban 没有自动存储兼容性验证;使用派生宏进行安全的升级脚手架,并依赖测试网测试

标签

skill ai

通过对话安装

以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 upgrade-stellar-contracts-1776077595 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 upgrade-stellar-contracts-1776077595 技能

通过命令行安装

skillhub install upgrade-stellar-contracts-1776077595

下载

⬇ 下载 upgrade-stellar-contracts v1.0.1(免费)

文件大小: 4.05 KB | 发布时间: 2026-4-15 14:48

v1.0.1 最新 2026-4-15 14:48
Fix display name from probe to proper title
返回顶部