# iCAN：最易于使用的容器管理平台


By [harlan009](https://paragraph.com/@harlan009) · 2022-05-11

---

iCAN：最易于使用的容器管理平台
=================

**_什么是 iCAN？-- IC 上最易于使用的 Canister 管理平台。_**

**背景**
======

1.  目前，开发者只能通过 NNS 钱包和 DFX 命令行来管理他们的容器。
    
2.  NNS 钱包仅显示有关 Canister 的基本信息。并且开发者不能轻易使用NNS钱包管理Canister。只有Canister id没有其他信息，使得开发者无法方便地使用NNS钱包管理自己的canister。
    
3.  难以通过 DFX CLI 管理容器状态。
    

**介绍**
======

**使用 UI 界面来方便的部署和管理您的 CANISTERS**

1.  iCAN = IC + Canister。它是一个基于 IC 的链上 Canister 管理工具。
    
2.  iCAN 帮助开发者通过图形界面管理 Canister，创建合约、下载 WebAssembly 模块、管理 Canister 状态指标等。
    

![iCan](https://storage.googleapis.com/papyrus_images/301bddac66578cd1d7fd80b531a1cf249329b03a7d936a8b3f693163a03963f3.png)

iCan

#### 功能

1.  **精细化管理**
    
    a.Canister设置的动态更改
    
    b.更方便的容器管理
    
    c.Canister的详细描述
    
2.  **状态检测**
    
    a.支持直接使用ICP向充值Canister，直接将Cycles存入Canister
    
    b.及时反馈Canister状态，让开发者了解Canister当前状态并及时管理
    
3.  **创建和删除**
    
    a.图形化的Canister管理界面
    
    b.能够创建和删除Canister，并自动取回Cycles
    
4.  **支持导入**
    
    将之前创建的Canisters导入您自己的hub。
    
5.  **WebAssembly 控制**
    
    下载最新的 WebAssembly文件
    

**优势**
======

iCAN 开发者平台帮助开发者管理 Canister。未来的目标是成为IC上的全面的合约管理平台。

1.  **在随机子网中创建管理Hub**
    
    通过在随机子网中创建的Hub，您可以选择要创建Canister的子网。
    
2.  **便捷管理**
    
    您可以命名Canister、标记它们或给它们一个描述，以便您可以方便地管理它们。
    
3.  **无信任管理**
    
    Hub Canister 仅由您自己控制，它支持无需信任的托管服务。
    

架构图
===

![iCAN 的工作原理](https://storage.googleapis.com/papyrus_images/4963ffb3c4838ee5c9ca5314e2be41cdff9c1314b9c3f565002cf668ad4a2912.png)

iCAN 的工作原理

**API**
=======

介绍iCAN Canister和Hub Canister的公共接口。

**类型**

        module{
            public type Error = {
                #Invalid_Caller;
                #Invalid_CanisterId;
                #No_Wasm;
                #No_Record;
                #Insufficient_Cycles;
                #Ledger_Transfer_Failed : Nat; // value : log id
                #Create_Canister_Failed : Nat;
            };
            public type Canister = {
                name : Text;
                description : Text;
                canister_id : Principal;
                wasm : ?[Nat8];
            };
            public type Status = {
                cycle_balance : Nat;
                memory : Nat;
            };
            public type UpdateSettingsArgs = {
                canister_id : Principal;
                settings : canister_settings
            };
            public type TransformArgs = {
                icp_amount : Nat64; // e8s
                to_canister_id : Principal
            };
            public type DeployArgs = {
                name : Text;
                description : Text;
                settings : ?canister_settings;
                deploy_arguments : ?[Nat8];
                wasm : ?[Nat8];
                cycle_amount : Nat;
                preserve_wasm : Bool;
            };
            public type canister_settings = {
                freezing_threshold : ?Nat;
                controllers : ?[Principal];
                memory_allocation : ?Nat;
                compute_allocation : ?Nat;
            };
        };
    

**iCAN Canister**

iCAN Canister 用于创建管理中心。

        // iCAN Canister Public Service Interface
        public type iCAN = actor{
            // get your own hubs' info (call this function use your identity)
            // @return array of (Hub Name, Hub Canister Id)
            getHub : query () -> async [(Text, Principal)];
            // get current hub wasm and cycle withdraw wasm in use
            // @return (hub wasm, cycle withdraw wasm)
            getWasms : query () -> async ([Nat8], [Nat8]);
            // get administrators of ican at present
            // @return array of administrators
            getAdministrators : query () -> async [Principal];
            // create canister management hub
            // @param name : hub name
            // @param amount : icp e8s amount
            createHub : (name : Text, amount : Nat64) -> async Result.Result<Principal, Error>;
            // add hub info to your hubs
            // @param name : hub name
            // @param hub_id : hub canister principal
            addHub : (name : Text, hub_id : Principal) -> async Text;
            // delete hub from your hub set
            deleteHub : (hub_id : Principal) -> async Result.Result<(), Error>;
            // transform icp to cycles and deposit the cycles to target cansiter
            transformIcp : (args : TransformArgs) -> async Result.Result<(), Error>;
        };
    

**Hub Canister**

Hub Canister是用户部署的个人管理Canister。

        public type Hub = actor{
            // get current version hub canister's wasm
            // @return Wasm Version
            getVersion : query() -> async Nat;
            // get owners of this hub canister
            // @return owners array
            getOwners : query() -> async [Principal];
            // get status of hub canister ( owner only )
            getStatus : query() -> async Result.Result<Status, Error>;
            // get canisters managed by this hub ( owner only )
            getCanisters : query() -> async Result.Result<[Canister], Error>;
            // get wasm of specified canister ( owner only )
            getWasm : query (canister_id : Principal) -> async Result.Result<[Nat8], Error>;
            // put canister into hub ( not matter if not controlled by hub canister ) ( owner only )
            // @param c : should be put into hub canister
            putCanister : (c : Canister) -> async Result.Result<(), Error>;
            // deploy canister by hub canister  ( owner only )
            // @return #ok(new canister's principal) or #err(Error)
            deployCanister : (args : DeployArgs) -> async Result.Result<Principal, Error>;
            // update canister settings  ( owner only )
            updateCanisterSettings : (args : UpdateSettingsArgs) -> async Result.Result<(), Error>;
            // start the specify canister, which should be controlled by hub canister  ( owner only )
            // @param principal : target canister's principal
            startCanister : (principal : Principal) -> async Result.Result<(), Error>;
            // stop canister ( owner only )
            // @param principal : target canister's principal
            stopCanister : (principal : Principal) -> async Result.Result<(), Error>;
            // deposit cycles to target canister ( equal to top up to target canister)
            // @param id : target canister principal, cycle amount : how much cycles should be top up
            depositCycles(id : Principal, cycle_amount : Nat, ) : async Result.Result<(), Error>;
            // delete canister from hub canister and withdraw cycles from it ( owner only )
            // @param canister's principal
            delCanister : ( id : Principal ) -> async Result.Result<(), Error>;
            // install cycle wasm to hub canister ( owner only )
            // @param wasm : cycle wasm blob (you can deploy your own cycle wasm to your hub canister)
            installCycleWasm : (wasm : [Nat8]) -> async Result.Result<(), Error>;
            // change hub owner ( owner only )
            // @param : new owners array
            changeOwner : (newOwners : [Principal]) -> async Result.Result<(), Error>;
        };
    

**路线图**
=======

**2022Q2** MVP 发布。

**2022Q3**全面支持当前的 Canister 管理。

1.  导入之前创建的容器
    
2.  支持部署 Actor Class Canister
    
3.  支持向 Hub Canister 添加更多管理员（支持团队合作）
    
4.  开源 iCAN 并交给社区 DAO
    

支持一键创建特定类型的Canister（asset canisters, NFT canisters）并上传前端assets。

**2022Q4上线**日志管理平台。支持数据恢复。

**2022Q4-2023**成为IC的最佳Canister管理平台和开发者基础设施。

**团队**
======

Mixlabs是由亚洲顶尖大学和社区开发者组成的区块链方向前沿技术实验室。主要从事区块链方向的前沿技术研究、孵化和生态支持。

**_快来加入我们吧！_**

_网站：icantool.app_

_推特：@iCAN\_DAPP_

_电子邮件：_[_team@icantool.app_](http://mailto:team@icantool.app/)

[https://embed.0xecho.com.ipns.page/?color-theme=light&desc=hello%20world&has-h-padding=true&has-v-padding=true&modules=like%2Cdislike%2Ctip%2Ccomment&receiver=ddd009.eth&target\_uri=https%3A%2F%2Fmirror.xyz%2Fddd009.eth%2F7ukjsRePZ3lOFt9L-nJ6rmRtKsaXWZtaEwFV8WGxJqU&height=800&display=iframe](https://embed.0xecho.com.ipns.page/?color-theme=light&desc=hello%20world&has-h-padding=true&has-v-padding=true&modules=like%2Cdislike%2Ctip%2Ccomment&receiver=ddd009.eth&target_uri=https%3A%2F%2Fmirror.xyz%2Fddd009.eth%2F7ukjsRePZ3lOFt9L-nJ6rmRtKsaXWZtaEwFV8WGxJqU&height=800&display=iframe)

---

*Originally published on [harlan009](https://paragraph.com/@harlan009/ican)*
