6. 权限管理

XuperChain 的权限管理分为两种,一种是对合约的权限管理ACL,一种是对链的权限管理平行链群组。

6.1. 合约ACL

合约ACL控制的是某一特定智能合约的准入权限,包括系统合约在内,合约实际上是一段部署在链上的可执行字节码,该合约的更新和查看需要一套权限控制方法,确保区块链上的数据权限。

6.1.1. 名词解释

  • AK(Access Key) :具体的一个address,由密码学算法生成一组公私钥对,然后将公钥用指定编码方式压缩为一个地址。

  • 账号(Account) : 在 XuperChain 上部署合约需要有账号, 账号可以绑定一组AK(公钥),并且AK可以有不同的权重。 账号的名字具有唯一性。

  • 合约 (Contract) : 一段部署在区块链上的可执行字节码,合约的运行会更新区块链的状态。我们允许一个账号部署多个合约。合约的名字具有唯一性。

6.1.2. 模型简介

系统会首先识别用户,然后根据被操作对象的ACL的信息来决定用户能否对其进行哪些操作

ACL简介

ACL简介

  • 个人账号AK:是指一个具体的地址Addr
    • 用户的创建是离线的行为,可以通过命令行工具或者API进行创建

  • 合约账号: XuperChain 智能合约的管理单元。
    • 账号的创建:
      • 任何账号或者AK都可以调用系统级智能合约创建账号

      • 创建账号需要指定账号对应的拥有者的地址集,如果一个账号中只有一个地址, 那么这个Addr对账号完全控制;

      • 创建账号需要指定ACL控制策略,用于账号其他管理动作的权限控制;

      • 创建账号需要消耗账号资源;

    • 账号名命名规则;
      • 合约账号由三部分组成,分为前缀,中间部分,后缀。

      • 前缀为XC,后缀为@链名

      • 中间部分为16个数字组成。

      • 在创建合约账号的时候,只需要传入16位数字,在使用合约账号的时候,使用完整的账号。

    • 账号管理:依地址集合据创建时指定的地址集和权限策略,管理账号其他操作
      • 账号股东剔除和加入

      • 账号资产转账

      • 创建合约,创建智能合约需要消耗账号资源,先将utxo资源打到账号下,通过消耗账号的utxo资源创建合约,验证的逻辑需要走账号的ACL控制

      • 合约Method权限模型管理

    • 智能合约: XuperChain 中的一个具体的合约,属于某个账号
      • 账号所属人员允许在账号内部署合约

      • 账号所属人员可以定义合约管理的权限模型

      • 设置合约方法的权限模型,合约内有一个权限表,记录:{ contract.method,permission_model}

    • 合约命名规则:长度为4~16个字符(包括4和16),首字母可选项为[a-ZA-Z_],末尾字符可选项为[a-zA-Z0-9_],中间部分的字符可选项为[a-zA-Z_.]

6.1.3. 实现功能

ACL主要有两个功能:账号权限管理、合约权限管理

  1. 账号权限管理 账号的创建、添加和删除AK、设置AK权重、权限模型

  2. 合约权限管理 设置合约调用权限,支持2种权限模型:
    1. 背书阈值:在名单中的AK或Account签名且他们的权重值加起来超过一定阈值,就可以调用合约

    2. AK集合: 定义多组AK集合,集合内的AK需要全部签名,集合间只要有一个集合有全部签名即可

6.1.4. 系统设计

ACL架构

ACL架构

6.1.5. ACL数据结构说明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// --------   Account and Permission Section -------
enum PermissionRule {
    NULL = 0;             // 无权限控制
    SIGN_THRESHOLD = 1;   // 签名阈值策略
    SIGN_AKSET = 2;       // AKSet签名策略
    SIGN_RATE = 3;        // 签名率策略
    SIGN_SUM = 4;         // 签名个数策略
    CA_SERVER = 5;        // CA服务器鉴权
    COMMUNITY_VOTE = 6;   // 社区治理
}

message PermissionModel {
    PermissionRule rule = 1;
    double acceptValue = 2;    // 取决于用哪种rule, 可以表示签名率,签名数或权重阈值
}

// AK集的表示方法
message AkSet {
    repeated string aks = 1; //一堆公钥
}

message AkSets {
    map<string, AkSet> sets = 1;   // 公钥or账号名集
    string expression = 2;      // 表达式,一期不支持表达式,默认集合内是and,集合间是or
}

// Acl实际使用的结构
message Acl {
    PermissionModel  pm = 1;             // 采用的权限模型
    map<string, double>  aksWeight = 2;  // 公钥or账号名  -> 权重
    AkSets akSets = 3;
}

签名阈值策略: Sum{Weight(AK_i) , if sign_ok(AK_i)}  >=  acceptValue

6.1.6. 系统合约接口

合约接口

用途

NewAccountMethod

创建新的账号

SetAccountACLMethod

更新账号的ACL

SetMethodACLMethod

更新合约Method的ACL

6.1.7. 样例

acl模型如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
    "pm": {
        "rule": 1,

        "acceptValue": 1.0
    },
    "aksWeight": {
        "AK1": 1.0,
        "AK2": 1.0
    }
}
  • 其中rule=1表示签名阈值策略,rule=2表示AKSet签名策略

  • 签名的ak对应的weight值加起来>acceptValue,则符合要求

6.2. 平行链群组

平行链群组用来对XuperChain的特定区块链进行管理,该功能需配合Xuper-Front联合使用以最终保证安全性。具体可见 平行链、群组和CA中心

6.2.1. 平行链群组流程

平行链、群组和CA中心的运行流程如下图所示。

平行链群组运行流程

平行链群组流程示意图

平行链群组的设计参考了Fabric对组织的设计,Group代表一群身份实体的集合,Group中可以添加地址信息,则这些信息可以相互共享平行链。 - 创建平行链时,需要绑定一个组织列表Group,ParaChain只允许组织列表Group中的身份访问其读写接口。

  • Group有admin权限,其为一个list结构,admin可以有权限向Group添加和删除成员。

  • Group有identities权限,其为一个list结构,identities可以有权限查询Group中的合约信息。

  • 更改Group信息通过系统合约实现,editGroupchain方法。

6.2.2. 技术细节

群组实现细节

群组实现细节示意图