权限控制

1 权限控制介绍

与可自由加入退出、自由交易、自由检索的公有链相比,联盟链有准入许可、交易多样化、基于商业上隐私及安全考虑、高稳定性等要求。因此,联盟链在实践过程中需强调“权限”及“控制”的理念。

为体现“权限”及“控制”理念,FISCO BCOS平台基于分布式存储,提出分布式存储权限控制的机制,可以灵活,细粒度的方式进行有效的权限控制,为联盟链的治理提供重要的技术手段。分布式权限控制基于外部账户(tx.origin)的访问机制,对包括合约部署,表的创建,表的写操作(插入、更新和删除)进行权限控制,表的读操作不受权限控制。 在实际操作中,每个账号使用独立且唯一的公私钥对,发起交易时使用其私钥进行签名,接收方可通过公钥验签知道交易具体是由哪个账号发出,实现交易的可控及后续监管的追溯。

2 权限控制规则

权限控制规则如下:

  1. 权限控制的最小粒度为表,基于外部账号进行控制。
  2. 使用白名单机制,未配置权限的表,默认完全放开,即所有外部账户均有读写权限。
  3. 权限设置利用权限表(_sys_table_access_)。权限表中设置表名和外部账户地址,则表明该账户对该表有读写权限,设置之外的账户对该表仅有读权限。

3 权限控制分类

分布式存储权限控制分为对用户表和系统表的权限控制。用户表指用户合约所创建的表,用户表均可以设置权限。系统表指FISCO BCOS区块链网络内置的表,系统表的设计详见存储文档。系统表的权限控制如下所示:

表名 是否生效 表存储数据说明 权限控制意义
_sys_tables_ 存储所有表的结构 控制部署合约和创建表
_sys_table_access_ 存储权限控制信息 控制权限功能设置
_sys_consensus_ 存储共识节点和观察节点的列表 控制节点类型设置
_sys_cns_ 存储cns列表 控制使用CNS
_sys_config_ 存储系统配置的列表 控制系统配置设置
_sys_current_state_ 存储最新的状态
_sys_tx_hash_2_block_ 存储交易hash到区块号的映射
_sys_number_2_hash_ 存储区块号到区块hash的映射
_sys_hash_2_block_ 存储区块hash到序列化区块的映射

针对用户表和每个系统表,SDK分别实现三个接口进行权限相关操作:

  • 用户表:
    • public String addUserTableManager(String tableName, String address): 根据用户表名和外部账号地址设置权限信息。
    • public String removeUserTableManager(String tableName, String address): 根据用户表名和外部账号地址去除权限信息。
    • public List<AuthorityInfo> queryUserTableManager(String tableName): 根据用户表名查询设置的权限记录列表(每条记录包含外部账号地址和生效块高)。
  • _sys_tables_表:
    • public String addDeployAndCreateManager(String address): 增加外部账号地址的部署合约和创建用户表权限。
    • public String removeDeployAndCreateManager(String address): 移除外部账号地址的部署合约和创建用户表权限。
    • public List<AuthorityInfo> queryDeployAndCreateManager(): 查询拥有部署合约和创建用户表权限的权限记录列表。
  • _sys_table_access_表:
    • public String addAuthorityManager(String address): 增加外部账号地址的管理权限的权限。
    • public String removeAuthorityManager(String address): 移除外部账号地址的管理权限的权限。
    • public List<AuthorityInfo> queryAuthorityManager(): 查询拥有管理权限的权限记录列表。
  • _sys_consensus_表:
    • public String addNodeManager(String address): 增加外部账号地址的节点管理权限。
    • public String removeNodeManager(String address): 移除外部账号地址的节点管理权限。
    • public List<AuthorityInfo> queryNodeManager(): 查询拥有节点管理的权限记录列表。
  • _sys_cns_表:
    • public String addCNSManager(String address): 增加外部账号地址的使用CNS权限。
    • public String removeCNSManager(String address): 移除外部账号地址的使用CNS权限。
    • public List<AuthorityInfo> queryCNSManager(): 查询拥有使用CNS的权限记录列表。
  • _sys_config_表:
    • public String addSysConfig(String address): 增加外部账号地址的系统参数管理权限。
    • public String removeSysConfig(String address): 移除外部账号地址的系统参数管理权限。
    • public List<AuthorityInfo> querySysConfig(): 查询拥有系统参数管理的权限记录列表。

设置和移除权限接口返回json字符串,包含code和msg字段,当无权限操作时,其code定义-1,msg定义为“non-authorized”。当成功设置权限时,其code为1(增加了1条权限记录),msg为“success”。

3 数据定义

权限信息以系统表的方式进行存储,权限表表名为_sys_table_access_,其字段信息定义如下:

字段 类型 是否为空 主键 描述
table_name string No PRI 表名称
address string No   外部账户地址
enable_num string No   权限设置生效区块高度
_status_ string No   分布式存储通用字段,“0”表示可用,“1”表示移除

其中,对权限表的插入或更新,当前区块不生效,在当前区块的下一区块生效。状态字段为“0”时,表示权限记录处于正常生效状态,为“1”时表示已删除,即表示权限记录处于失效状态。

4 流程图

4.1 用户表权限控制流程

外部账户查询表不进行权限控制。当需要更新,增加或移除记录时,将通过查询权限表进行权限控制。流程如下图所示。 ../../../_images/ac1.png

4.2 系统表权限控制流程

对于sdk层,用户合约不可以直接操作权限表,通过sdk的AuthorityService接口(详见sdk使用文档)和控制台(详见控制台使用文档)可以操作系统表。对于C++底层,当需要操作权限表时,通过AuthorityPreCompiled进行权限表的操作。其中查询权限表不需要检查权限,新增和移除权限表的记录需要检查权限。整个系统内权限相关的增删查将通过AuthorityPreCompiled进行维护。所有权限内容记录在区块链上。交易请求发起后,系统将访问_sys_table_access_表查询该交易发起方是否有对应的权限。如果有权限,执行交易;如果无权限,则返回无权限操作提示。 ../../../_images/ac2.png

注: _sys_consensus_表(ConsensusPrecompiled),_sys_cns_表(CNSPrecompiled),_sys_config_表(SystemConfigPrecompiled)控制流程与对权限表的控制流程类似。

5 权限控制工具

FISCO BCOS的分布式存储权限控制有如下使用方式:

  • 针对普通用户,通过控制台命令使用权限功能,具体参考权限控制操作文档
  • 针对开发者,SDK根据权限控制的用户表和每个系统表均实现了三个接口,分别是增加,移除和查询权限接口。可以调用SDK API的AuthorityService接口使用权限功能。