基于角色的权限控制

当前基于表的权限控制,由于涉及到许多系统表,要求用户对底层的逻辑有一定理解,使用门槛较高。从2.5.0版本开始,基于已有的表权限控制模型,新增了ChainGovernance预编译合约,用于实现基于角色的权限控制。

角色定义

分为治理方、运维方、监管方和业务方。考虑到权责分离,治理方、运维方和开发方权责分离,角色互斥。

  • 治理方:拥有投票权,可以参与治理投票(AUTH_ASSIGN_AUTH),可以增删节点、修改链配置、添加撤销运维、冻结解冻合约、对用户表的写权限控制。链级别的可变配置的权限。
  • 运维方:由治理方添加运维账号,运维账号可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约。
  • 业务方:业务方账号由运维添加到某个合约,可以调用该合约的写接口。
  • 监管方:监管方监管链的运行,能够获取链运行中权限变更的记录、能够获取需要审计的数据

权限

以下简称治理账号为委员

  • 权限项命名符合动宾结构。
  • 增删委员、修改委员权重、修改生效阈值三个操作,需要有效投票权重/总权重>生效阈值生效。其中总权重=SUM(委员权重)
  • 治理账号可以添加运维账号,但治理账号不拥有运维的权限
  • 运维账号可以为某个合约添加业务账号,但运维账号没有业务账号权限

../../../_images/roles.png

权限项

权限操作控制方式命名默认阈值修改方式
增删委员控制写权限表AUTHASSIGN_AUTH0.5委员投票
修改委员权重控制写权限表AUTH_ASSIGN_AUTH0.5委员投票
修改生效投票阈值(投票委员权重和大于该值)控制写权限表AUTH_ASSIGN_AUTH0.5委员投票
增删节点(观察/共识)控制写共识表AUTH_CTRL_NODE委员可操作
修改链配置项控制写配置表AUTH_MODIFY_CONFIG委员可操作
冻结解冻合约合约生命周期AUTH_CTRL_CONTRACT_LIFE委员可操作
添加撤销运维AUTH_CTRL_OPERATOR委员可操作
用户表写权限AUTH_CTRL_USER_TABLE委员可操作
部署合约_sys_tables的写权限AUTHCREATE_TABLE运维操作
创建表_sys_tables的写权限AUTH_CREATE_TABLE运维操作
合约版本管理CNSAUTH_CTRL_CNS运维操作
冻结解冻本账号部署的合约修改合约状态运维操作
调用合约合约表写权限业务操作

计票与生效

  • 所有治理操作需要有效投票数/委员数>生效阈值才能生效
  • 每次投票操作,如果是委员投票,则记录操作内容和投票委员,不重复计票
  • 每次投票操作,计票结束后,计算有效投票数/委员数,如果大于此操作的生效阈值,则对应操作生效,写入
  • 投票设置过期时间,根据块高,blockLimit的10倍,固定不可改

功能列表

  1. 增删委员计票与生效
  2. 修改委员权重计票与生效
  3. 修改生效阈值计票与生效
  4. 委员增删运维
  5. 委员解冻冻结合约
  6. 委员增删节点
  7. 委员修改系统配置
  8. 权限项默认阈值存储
  9. 运维部署合约的权限
  10. 运维管理合约版本的权限

委员相关

  1. function grantCommitteeMember(address user) public returns (int256);
  2. function updateCommitteeMemberWeight(address user, int256 weight) public returns (int256);
  3. function revokeCommitteeMember(address user) public returns (int256);
  4. function listCommitteeMembers() public returns (string);
  5. // threshold取值范围[0,100]
  6. function updateThreshold(int256 threshold) public returns (int256);

运维相关

  1. function grantOperator(address user) public returns (int256);
  2. function revokeOperator(address user) public returns (int256);
  3. function listOperator() public returns (string);

数据结构

表:_sys_committee_votes_

idstatusnumkeyvalueoriginenable_num
  • key是账户,value记录grant/revoke,origin记录投票人
  • key是账户_update_weight,value记录目标权重,origin记录投票人
  • key是账户_weight,value记录权重
  • key是auth_threshold,value记录当前阈值
  • key是update_auth_threshold,value记录目标阈值,origin记录投票人