版本比较

密钥

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

一、需求描述

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

...

用户可以对AppVersion和PluginVersion进行Star和评论

3、应用扩展点

扩展点名称:0x1::ExtensionPointDAOSpace::IAppApp

扩展点接口定义:

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

serviceimport React from 'react';

export interface IApp {
    rpc bootstrap();name: string,
    rpc mount(map<stringactiveWhen: string,
string>);     rpc unmount(map<string, string>);
entry: React.ReactNode
}

export interface IDAO {
   rpc updateregisterApp(map<string,app: string>IApp);
}

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

插件运行在浏览器的VM中。

注意:

由于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 PluginMarketplace {
    struct PluginRegistry has key{
        next_plugin_id: u64,
    }
    
    struct PluginVersion<AppT> has key{
        number: u64, // 数字版本号,例如1,2,3
        version: vector<u8>, //插件版本号,例如v0.1.1
        required_caps: vector<vector<u8>>, //依赖的能力
        export_caps: vector<vector<u8>>, //导出的能力
        implement_extpoints: vector<vector<u8>>, //实现的扩展点
        depend_extpoints: vector<vector<u8>>, //依赖的扩展点
        installcontract_functionmodule: vector<u8>, // 安装函数合约模块, 格式:${address}::${module}::${func_name}
        webjs_entry_uri: vector<u8>, // 插件JS代码入口,例如:前端JS代码资源URI,例如:"https://cdn.xxxx.xxxx/xxxx/xxxxx.js"
        git_repo: vector<u8>, // git仓库代码
    }
    
    struct PluginStarStar has key{
        addr: address, // Star人的钱包地址,可以是短地址,例如 zhangsan.stc
        created_at: u64, //创建时间
    }
    
    struct PluginCommentComment 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>vector<Star>,// 插件的所有star
        comments: vector<PluginComment>vector<Comment>, // 插件的所有评论
        git_repo: vector<u8>, // git仓库代码
        created_at: u64, //插件创建时间
        update_at: u64, //插件最后一次更新时间
    }
}

...

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

2.5 插件的安装与卸载

合约端:

代码块
module ${PluginName}{
    // 安装插件
    public(script) fun setup<DaoT>(sender: signer, dao: DaoT)
    
    // 卸载插件
    public(script) fun teardown<DaoT>(sender: signer, dao: DaoT)
}

web端:

代码块
// 所有前端插件JS加载后的对象,需要暴露下面两个方法
// 用于完成插件的初始化和卸载。
// 插件加载后运行在独立的VM中
// 前端VM技术参考:https://www.garfishjs.org/blog
interface IPlugin {
    // 前端插件安装方法
    void setup(depends: ExtensionPoint[])
    
    // 前端插件卸载方法
    void teardown()
}

2.6 插件市场界面

2.5.1 插件市场

2.5.2 创建插件

2.5.3 上传插件

2.5.4 对插件点赞

2.5.5 对插件进行评论

...

3、应用插件开发

1个应用插件就是一个Dapp,包括前端页面和后端合约代码,扩展DAO的一个功能,例如成员管理、Grant管理等。

DAO的微应用就是一个Dapp,包括前端页面和后端合约代码,完成DAO的一个功能,例如成员管理、Grant管理等。每个DAO可以安装多个微应用,每个微应用安装时获取声明的能力,如果DAO中某种能力只有一个实例,那么只有获取对应能力的微应用才能安装,其他同类型的微应用由于获取不到需要的能力,所以不能安装。每个DAO可以安装多个应用插件,每个应用插件安装时获取声明的能力,如果DAO中某种能力只有一个实例,那么只有获取对应能力的应用插件才能安装,其他同类型的应用插件由于获取不到需要的能力,所以不能安装。

一个微应用可以将一个能力封装后,提供更多能力和扩展点。这样就可以安装其他微应用或者插件。一个应用插件可以将一个能力封装后,提供更多能力和扩展点。这样就可以安装其他插件。

3.1

...

应用插件的配置

所有实现了应用扩展点接口的插件为应用插件。

应用插件的 dao_plugin.json:json 配置:

代码块
languagejson
{
    "id": 1, // 在DAOSpace注册的插件ID
    "name": "hello-world", // 插件名称
    "version": "v0.1.1" // 插件版本
    "icon": "ipfs://xxxxxxxxx/xxxxxxx.svg"
    "implements": [
        "0x1::ExtensionPoint::IApp" // 实现应用接口实现应用扩展点接口
     ],
    "required_caps": [
        "0x1::DAOSpace::DAOUpgradeModuleCap", // 需要DAO升级能力
        "0x1::DAOSpace::DAOMemberCap" // 需要DAO成员管理能力
    ],
    "contact": "./constract/Move.toml",
    "web": "./web/package.json"
}

...