【问题标题】:Motoko Upgrade Actor Class Canister元子升级演员等级罐
【发布时间】:2022-07-05 05:44:53
【问题描述】:

我在动态创建的 motoko 应用程序中使用actor classes。如何使用 dfx 升级这些容器。

使用dfx deploy 时,它只会升级静态actor 容器,而不是我动态创建的任何actor classes

更新 1:

我发现 IC 管理容器可以使用 webassembly 字节在其他容器上安装新代码,但我不确定如何获取新代码来更新参与者类实例

对所有已部署的动态创建的 Actor 类进行更新的正确方法是什么?

示例

Main.mo

import A "ActorClass";
import Array "mo:base/Array";
import Cycles "mo:base/ExperimentalCycles";


actor MainCanister {

    var created_canisters : [A.ActorClass] = [];

    public func create_player() : async A.ActorClass {
        let canister : A.ActorClass = await A.ActorClass();
        created_canisters := Array.append(created_canisters, [canister]);
        return canister;
    };
};

ActorClass.mo

actor class ActorClass() {

}

第 1 步:部署

MainCainster 已按预期安装

第二步:调用create_playerfunc

创建了一个 ActorClass 的实例/容器

第 3 步:使用新的/更改的功能更新 ActorClass

第 4 步:重新部署

只有 MainCanister 被更新,而不是任何 ActorClass 实例


【问题讨论】:

  • 您能否提供一些重现您的问题的基本示例?
  • 已更新示例

标签: motoko internet-computer


【解决方案1】:

我猜你的意思是 ActorClass 签名已更新,但其状态已丢失。

那么我建议你有这样的模式:

actor MainCanister {
    let actor_class : A.ActorClass = A.ActorClass("Hello world !");

    stable var actor_class_state : ActorClassState = {
        actor_class_string = "";
    };

    system func preupgrade() {
        actor_class_state := A.get_state(actor_class);
    };

    system func postupgrade() {
        actor_class := A.from_state(actor_class_state);
    };

    // ...
}

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多