版本比较

密钥

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。
目录

一、需求描述

去中心化公司治理协作平台。类似Web2的钉钉和飞书。功能包括:

...

对于新功能通过子应用来扩展,对于已有功能的不同实现通过插件来扩展。

二、需求分析

1、用例图

...

对于DAO按功能分,包括:对于DAO按功能分,包括:财务管理、成员管理、插件管理、模块升级管理

财务管理

成员管理

插件管理

模块升级管理

配置管理

和配置管理等。

2、能力树

starcoin中权限控制通过能力来实现,能力可用派生子能力,子能力也可以派生子子能力,这样就形成能力树。通过能力树实现权力的下放。

...

DAOSpace内部有插件的注册表,任何用户都可以开发插件,注册到DAOSpace, DAO合约根据自己的需求安装插件。前端采用微前端架构,主应用从DAO合约中读取该合约安装的应用插件和其他插件,完成主应用的初始化,包括子应用插件的注册,路由绑定等。当用户切换浏览器地址时,微前端框架根据注册的路由启动对应的子应用插件。子应用插件通过应用插件合约接口完成业务功能。

应用插件前端采用微前端架构,主应用从DAO合约中读取该合约安装的应用插件和其他插件,完成主应用的初始化,包括应用插件的注册,路由绑定等。当用户切换浏览器地址时,微前端框架根据注册的路由启动对应的应用插件。应用插件通过应用插件合约接口完成业务功能。

应用插件类似钉钉和飞书的应用,有自己的界面,可以完成1到多个独立的功能。应用插件暴露1到多个扩展点。应用插件是对DAO功能的扩展,类似钉钉和飞书的应用,有自己的界面,可以完成1到多个独立的功能。

其他插件主要用来扩展应用的功能,实现应用插件定义的扩展点。应用插件也可以暴露1到多个扩展点,供其他插件来扩展。

2、领域类图

1个插件实现1到n个扩展点,1个扩展点可以被多个插件实现

...

代码块
package 0x1.ExtensionPoint;
syntax = "proto3";

service IApp {
    rpc bootstrap();
    rpc mount(map<string, string>);
    rpc unmount(map<string, string>);
    rpc update(map<string, string>);
}

扩展点接口通过protobuf定义。扩展点接口通过protobuf定义,实现应用扩展点的插件为应用插件,主要用于扩展DAOSpace功能。

注意:

由于Move不支持合约动态调用合约代码,所以扩展点定义的接口都是通过JS实现。所有动态调用需求都由前端中转。

四、详细设计

1、扩展点管理

1.1 扩展点资源定义

代码块
languagerust
module ExtensionPoint {
   struct ExtensionPoint<ExtT> has key {
       id: u64, //扩展点的ID,按注册顺序自增
       name: vector<u8>, //名字,例如 DAOSpace.IApp/v1
       describe: vector<u8>, //描述
       protobuf: vector<u8>, //扩展点接口定义,通过protobuf定义
       created_at: u64, //创建时间
   }

   struct ExtensionPointRegistry has key{
       next_id: u64,
   }
}

...

代码块
module ExtensionPoint {
    // 初始化 Registry
    public(friendscript) fun init()
    
    // 注册扩展点
    public(friendscript) fun registerExtensionPoint<ExtT>(name: vector<u8>, describe: vector<u8>, protobuf:vector<u8>): u64;
}

...

1.3.1 分页展示所有扩展点

列表:

...

详情:

...

1.3.2 创建新的扩展点

...

...

2、插件市场

2.1

...

插件市场资源定义

代码块
module DAOSpacePluginMarketplace {
    struct PluginRegistry has key{
        next_plugin_id: u64,
    }
    
    struct PluginVersion<AppT> has key{
        number: u64, // 数字版本号,例如1,2,3
        vercionversion: vector<u8>, //插件版本号,例如v0.1.1
        iconrequired_caps: vector<u8>vector<vector<u8>>, //插件图标依赖的能力
        requiredexport_caps: vector<vector<u8>>, //依赖的能力导出的能力
        exportimplement_capsextpoints: vector<vector<u8>>, //导出的能力实现的扩展点
        gitdepend_repoextpoints: vector<u8>vector<vector<u8>>, // git仓库代码依赖的扩展点
        install_function: vector<u8>, // 安装函数, 格式:${address}::${module}::${func_name}
        web_entry: vector<u8>, // 插件JS代码入口,例如:"https://cdn.xxxx.xxxx/xxxx/xxxxx.htmljs"
        git_repo: vector<u8>, //Web入口 git仓库代码
    }
    
    struct PluginStar has key{
        addr: address, // Star人的钱包地址,可以是短地址,例如 zhangsan.stc
        created_at: u64, //创建时间
    }
    
    struct PluginComment has key{
        addr: address, // 评论人的钱包地址,可以是短地址,例如 zhangsan.stc
        content: vector<u8> //评论内容
        created_at: u64, //创建时间
    }
    
    struct PluginInfo<AppT> has key{
        id: u64, //插件ID
        name: vector<u8>, //插件名称
        describe: vector<u8>, //插件描述
        next_version_number: u64, //下一个版本号
        versions: vector<PluginVersion>, //插件的所有版本
        stars: vector<PluginStar>,// 插件的所有star
        comments: vector<PluginComment>, // 插件的所有评论
        implements: vector<string>, //实现的扩展点
     
  depends: vector<string>, //依赖的扩展点         created_at: u64, //插件创建时间
        update_at: u64, //插件最后一次更新时间
    }
}

2.2

...

插件市场合约接口

代码块
module DAOSpacePluginMarketplace {
    // 初始化 Registry
    public(script) fun init()
    
    // 注册插件,获取插件ID和所有权
    public(friendscript) fun register_plugin<AppT>plugin(sender: signer, plugin_name: vector<u8>): u64 acquires PluginRegistry
    
    // 发布插件版本
    public(friendscript) fun publish_plugin_version<AppT>(sender: signer, appplugin_id: u64, version: PluginVersion): u64 acquires PluginRegistry
    
}

2.3 插件的配置文件

dao_plugin.json 为插件的配置文件:

...

调用publish_plugin_version合约方法,发布新版本。

2.5

...

插件市场界面

2.5.1 插件市场

2.5.2 创建插件

2.5.3 上传插件

...

12、https://www.npmjs.com/package/protobufjs 《protobuf JS库》

13、https://www.zhihu.com/question/20628768