权限控制

基于角色的权限控制

本节描述角色权限控制的操作,使用前请先阅读设计文档角色权限控制设计文档。2.5.0版本开始,提供一种基于角色的权限控制模型,原来的链管理员相当于当前的治理委员会委员角色,拥有链治理相关的操作权限。用户不需要去具体关注底层系统表对应的权限,只需要关注角色的权限即可。

权限与角色

  1. 链治理委员会委员简称为委员
  2. 权限使用白名单机制,默认不检查,当存在至少一个角色的账号时,角色对应的权限检查生效
  3. 委员可以冻结解冻任意合约,同时合约的部署账号也可以冻结解冻合约
  4. 委员可以冻结解冻账号,被冻结的账号无法发送交易
权限操作修改方式
增删委员委员投票
修改委员权重委员投票
修改生效投票阈值(投票委员权重和大于该值)委员投票
增删节点(观察/共识)委员账号
修改链配置项委员账号
冻结解冻合约委员账号
冻结解冻账号委员账号
添加撤销运维委员账号
用户表的写权限委员账号
部署合约运维账号
创建表运维账号
合约版本管理运维账号
冻结解冻本账号部署的合约运维账号
调用合约写接口有管理合约生命周期权限的账号

操作内容

  • 委员新增、撤销与查询
  • 委员权重修改
  • 委员投票生效阈值修改
  • 委员权限
  • 运维新增、撤销与查询

环境配置

配置并启动FISCO BCOS 2.0区块链节点和控制台,请参考安装文档

权限控制示例账户

控制台提供账户生成脚本get_account.sh,生成的账户文件在accounts目录下。控制台可以指定账户启动,具体用法参考控制台手册。因此,通过控制台可以指定账户,体验权限控制功能。在控制台根目录下通过get_account.sh脚本生成三个PEM格式的账户文件如下:

  1. # 账户1
  2. 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a.pem
  3. # 账户2
  4. 0x85961172229aec21694d742a5bd577bedffcfec3.pem
  5. # 账户3
  6. 0x0b6f526d797425540ea70becd7adac7d50f4a7c0.pem

现在可以打开三个连接Linux的终端,分别以三个账户登录控制台。

指定账户1登录控制台:

  1. ./start.sh 1 -pem accounts/0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a.pem

指定账户2登录控制台:

  1. ./start.sh 1 -pem accounts/0x85961172229aec21694d742a5bd577bedffcfec3.pem

指定账户3登录控制台:

  1. ./start.sh 1 -pem accounts/0x0b6f526d797425540ea70becd7adac7d50f4a7c0.pem

委员新增、撤销与查询

我们添加账户1、账户2为委员,账户3为普通用户。链初始状态,没有任何权限账户记录。测试账户3不能操作委员权限,而账户1、2可以。

委员的权限包括治理投票、增删节点、冻结解冻合约、冻结解冻账号、修改链配置和增删运维账号。

添加账户1为委员

添加账户1为委员成功。

  1. [group:1]> grantCommitteeMember 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listCommitteeMembers
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a | 1 |
  10. ---------------------------------------------------------------------------------------------

使用账户1添加账户2为委员

增加委员需要链治理委员会投票,有效票大于阈值才可以生效。此处由于只有账号1是委员,所以账号1投票即可生效。

  1. [group:1]> grantCommitteeMember 0x85961172229aec21694d742a5bd577bedffcfec3
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listCommitteeMembers
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a | 1 |
  10. | 0x85961172229aec21694d742a5bd577bedffcfec3 | 2 |
  11. ---------------------------------------------------------------------------------------------

注意这里使用账户1对应的控制台操作。

验证账号3无权限执行委员操作

在账号3的控制台中操作,此处以链配置操作为例。

  1. [group:1]> setSystemConfigByKey tx_count_limit 100
  2. {
  3. "code":-50000,
  4. "msg":"permission denied"
  5. }

撤销账号2的委员权限

此时系统中有两个委员,默认投票生效阈值50%,所以需要两个委员都投票撤销账号2的委员权限,有效票/总票数=2/2=1>0.5才满足条件。

  • 账号1投票撤销账号2的委员权限
  1. [group:1]> revokeCommitteeMember 0x85961172229aec21694d742a5bd577bedffcfec3
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listCommitteeMembers
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a | 1 |
  10. | 0x85961172229aec21694d742a5bd577bedffcfec3 | 2 |
  11. ---------------------------------------------------------------------------------------------
  • 账号2投票撤销账号2的委员权限
  1. [group:1]> revokeCommitteeMember 0x85961172229aec21694d742a5bd577bedffcfec3
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listCommitteeMembers
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a | 1 |
  10. ---------------------------------------------------------------------------------------------

委员权重修改

先添加账户1、账户3为委员。然后更新委员1的票数为2。

  • 使用账号1的控制台添加账号3为委员
  1. [group:1]> grantCommitteeMember 0x0b6f526d797425540ea70becd7adac7d50f4a7c0
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listCommitteeMembers
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a | 1 |
  10. | 0x0b6f526d797425540ea70becd7adac7d50f4a7c0 | 9 |
  11. ---------------------------------------------------------------------------------------------
  • 使用账号1的控制台投票更新账号1的票数为2
  1. [group:1]> updateCommitteeMemberWeight 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a 2
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> queryCommitteeMemberWeight 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a
  7. Account: 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a Weight: 1
  • 使用账号3的控制台投票更新账号1的票数为2
  1. [group:1]> updateCommitteeMemberWeight 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a 2
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> queryCommitteeMemberWeight 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a
  7. Account: 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a Weight: 2

委员投票生效阈值修改

账户1和账户3为委员,账号1有2票,账号3有1票,使用账号1添加账号2为委员,由于2/3>0.5所以直接生效。使用账号1和账号2,更新生效阈值为75%。

  • 账户1添加账户2为委员
  1. [group:1]> grantCommitteeMember 0x85961172229aec21694d742a5bd577bedffcfec3
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listCommitteeMembers
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x61d88abf7ce4a7f8479cff9cc1422bef2dac9b9a | 1 |
  10. | 0x0b6f526d797425540ea70becd7adac7d50f4a7c0 | 9 |
  11. | 0x85961172229aec21694d742a5bd577bedffcfec3 | 12 |
  12. ---------------------------------------------------------------------------------------------
  • 使用账户1控制台投票更新生效阈值为75%
  1. [group:1]> updateThreshold 75
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> queryThreshold
  7. Effective threshold : 50%
  • 使用账户2控制台投票更新生效阈值为75%
  1. [group:1]> updateThreshold 75
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> queryThreshold
  7. Effective threshold : 75%

运维新增、撤销与查询

委员可以添加运维,运维角色的权限包括部署合约、创建表、冻结解冻所部署的合约、使用CNS服务。

基于职责权限分离的设计,委员角色不能兼有运维的权限,生成一个新的账号40x283f5b859e34f7fd2cf136c07579dcc72423b1b2.pem

  • 添加账号4为运维角色
  1. [group:1]> grantOperator 0x283f5b859e34f7fd2cf136c07579dcc72423b1b2
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listOperators
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x283f5b859e34f7fd2cf136c07579dcc72423b1b2 | 15 |
  10. ---------------------------------------------------------------------------------------------
  • 使用运维账号部署HelloWorld
  1. [group:1]> deploy HelloWorld
  2. contract address: 0xac1e28ad93e0b7f9108fa1167a8a06585f663726
  • 使用账号1部署HelloWorld失败
  1. [group:1]> deploy HelloWorld
  2. permission denied
  • 使用账号1控制台撤销账号4的运维权限
  1. [group:1]> revokeOperator 0x283f5b859e34f7fd2cf136c07579dcc72423b1b2
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listOperators
  7. Empty set.

基于表的权限控制

本文档描述权限控制的实践操作,有关权限控制的详细设计请参考权限控制设计文档

重要

推荐管理员机制:由于系统默认无权限设置记录,因此任何账户均可以使用权限设置功能。例如当账户1设置账户1有权限部署合约,但是账户2也可以设置账户2有权限部署合约。那么账户1的设置将失去控制的意义,因为其他账户可以自由添加权限。因此,搭建联盟链之前,推荐确定权限使用规则。可以使用grantPermissionManager指令设置链管理员账户,即指定特定账户可以使用权限分配功能,非链管理员账户无权限分配功能。

操作内容

本文档分别对以下功能进行权限控制的操作介绍:

环境配置

配置并启动FISCO BCOS 2.0区块链节点和控制台,请参考安装文档

权限控制工具

FISCO BCOS提供控制台命令使用权限功能(针对开发者,可以调用SDK API的PermissionService接口使用权限功能),其中涉及的权限控制命令如下:

命令名称命令参数功能
grantPermissionManageraddress授权账户的链管理员权限
revokePermissionManageraddress撤销账户的链管理员权限
listPermissionManager查询拥有链管理员权限的账户列表
grantDeployAndCreateManageraddress授权账户的部署合约和创建用户表权限
revokeDeployAndCreateManageraddress撤销账户的部署合约和创建用户表权限
listDeployAndCreateManager查询拥有部署合约和创建用户表权限的账户列表
grantNodeManageraddress授权账户的节点管理权限
revokeNodeManageraddress撤销账户的节点管理权限
listNodeManager查询拥有节点管理的账户列表
grantCNSManageraddress授权账户的使用CNS权限
revokeCNSManageraddress撤销账户的使用CNS权限
listCNSManager查询拥有使用CNS的账户列表
grantSysConfigManageraddress授权账户的修改系统参数权限
revokeSysConfigManageraddress撤销账户的修改系统参数权限
listSysConfigManager查询拥有修改系统参数的账户列表
grantUserTableManagertable_name address授权账户对用户表的写权限
revokeUserTableManagertable_name address撤销账户对用户表的写权限
listUserTableManagertable_name查询拥有对用户表写权限的账号列表

权限控制示例账户

控制台提供账户生成脚本get_account.sh,生成的账户文件在accounts目录下。控制台可以指定账户启动,具体用法参考控制台手册。因此,通过控制台可以指定账户,体验权限控制功能。为了账户安全起见,我们可以在控制台根目录下通过get_account.sh脚本生成三个PKCS12格式的账户文件,生成过程中输入的密码需要牢记。生成的三个PKCS12格式的账户文件如下:

  1. # 账户1
  2. 0x2c7f31d22974d5b1b2d6d5c359e81e91ee656252.p12
  3. # 账户2
  4. 0x7fc8335fec9da5f84e60236029bb4a64a469a021.p12
  5. # 账户3
  6. 0xd86572ad4c92d4598852e2f34720a865dd4fc3dd.p12

现在可以打开三个连接Linux的终端,分别以三个账户登录控制台。

指定账户1登录控制台:

  1. $ ./start.sh 1 -p12 accounts/0x2c7f31d22974d5b1b2d6d5c359e81e91ee656252.p12

指定账户2登录控制台:

  1. $ ./start.sh 1 -p12 accounts/0x7fc8335fec9da5f84e60236029bb4a64a469a021.p12

指定账户3登录控制台:

  1. $ ./start.sh 1 -p12 accounts/0xd86572ad4c92d4598852e2f34720a865dd4fc3dd.p12

授权账户为链管理员

提供的三个账户设为三种角色,设定账户1为链管理员账户,账户2为系统管理员账户,账户3为普通账户。链管理员账户拥有权限管理的权限,即能分配权限。系统管理员账户可以管理系统相关功能的权限,每一种系统功能权限都需要单独分配,具体包括部署合约和创建用户表的权限、管理节点的权限、利用CNS部署合约的权限以及修改系统参数的权限。链管理员账户可以授权其他账户为链管理员账户或系统管理员账户,也可以授权指定账号可以写指定的用户表,即普通账户。

链初始状态,没有任何权限账户记录。现在,可以进入账户1的控制台,设置账户1成为链管理员账户,则其他账户为非链管理员账户。

  1. [group:1]> grantPermissionManager 0x2c7f31d22974d5b1b2d6d5c359e81e91ee656252
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listPermissionManager
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x2c7f31d22974d5b1b2d6d5c359e81e91ee656252 | 1 |
  10. ---------------------------------------------------------------------------------------------

设置账户1为链管理员成功。

授权账户为系统管理员

授权部署合约和创建用户表

通过账户1授权账户2为系统管理员账户,首先授权账户2可以部署合约和创建用户表。

  1. [group:1]> grantDeployAndCreateManager 0x7fc8335fec9da5f84e60236029bb4a64a469a021
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listDeployAndCreateManager
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x7fc8335fec9da5f84e60236029bb4a64a469a021 | 2 |
  10. ---------------------------------------------------------------------------------------------

登录账户2的控制台,部署控制台提供的TableTest合约。TableTest.sol合约代码参考这里。其提供创建用户表t_test和相关增删改查的方法。

  1. [group:1]> deploy TableTest.sol
  2. contract address:0xfe649f510e0ca41f716e7935caee74db993e9de8

调用TableTest的create接口创建用户表t_test。

  1. [group:1]> call TableTest.sol 0xfe649f510e0ca41f716e7935caee74db993e9de8 create
  2. transaction hash:0x67ef80cf04d24c488d5f25cc3dc7681035defc82d07ad983fbac820d7db31b5b
  3. ---------------------------------------------------------------------------------------------
  4. Event logs
  5. ---------------------------------------------------------------------------------------------
  6. createResult index: 0
  7. count = 0
  8. ---------------------------------------------------------------------------------------------

用户表t_test创建成功。

登录账户3的控制台,部署TableTest合约。

  1. [group:1]> deploy TableTest.sol
  2. {
  3. "code":-50000,
  4. "msg":"permission denied"
  5. }

账户3没有部署合约的权限,部署合约失败。

  • 注意: 其中部署合约和创建用户表是“二合一”的控制项,在使用Table合约(CRUD接口合约)时,我们建议部署合约的时候一起把合约里用到的表创建了(在合约的构造函数中创建表),否则接下来读写表的交易可能会遇到“缺表”错误。如果业务流程需要动态创建表,动态建表的权限也应该只分配给少数账户,否则链上可能会出现各种废表。

授权利用CNS部署合约

控制台提供3个涉及CNS的命令,如下所示:

命令名称命令参数功能
deployByCNScontractName contractVersion利用CNS部署合约
callByCNScontractName contractVersion funcName params利用CNS调用合约
queryCNScontractName [contractVersion]查询CNS信息

注意: 其中deployByCNS命令受权限可以控制,且同时需要部署合约和使用CNS的权限,callByCNS和queryCNS命令不受权限控制。

登录账户1的控制台,授权账户2拥有利用CNS部署合约的权限。

  1. [group:1]> grantCNSManager 0x7fc8335fec9da5f84e60236029bb4a64a469a021
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listCNSManager
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x7fc8335fec9da5f84e60236029bb4a64a469a021 | 13 |
  10. ---------------------------------------------------------------------------------------------

登录账户2的控制台,利用CNS部署合约。

  1. [group:1]> deployByCNS TableTest.sol 1.0
  2. contract address:0x24f902ff362a01335db94b693edc769ba6226ff7
  3. [group:1]> queryCNS TableTest.sol
  4. ---------------------------------------------------------------------------------------------
  5. | version | address |
  6. | 1.0 | 0x24f902ff362a01335db94b693edc769ba6226ff7 |
  7. ---------------------------------------------------------------------------------------------

登录账户3的控制台,利用CNS部署合约。

  1. [group:1]> deployByCNS TableTest.sol 2.0
  2. {
  3. "code":-50000,
  4. "msg":"permission denied"
  5. }
  6. [group:1]> queryCNS TableTest.sol
  7. ---------------------------------------------------------------------------------------------
  8. | version | address |
  9. | 1.0 | 0x24f902ff362a01335db94b693edc769ba6226ff7 |
  10. ---------------------------------------------------------------------------------------------

部署失败,账户3无权限利用CNS部署合约。

授权管理节点

控制台提供5个有关节点类型操作的命令,如下表所示:

命令名称命令参数功能
addSealernodeID设置节点为共识节点
addObservernodeID设置节点为观察节点
removeNodenodeID设置节点为游离节点
getSealerList查询共识节点列表
getObserverList查询观察节点列表
  • 注意: 其中addSealer、addObserver和removeNode命令受权限控制,getSealerList和getObserverList命令不受权限控制。

登录账户1的控制台,授权账户2拥有管理节点的权限。

  1. [group:1]> grantNodeManager 0x7fc8335fec9da5f84e60236029bb4a64a469a021
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listNodeManager
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x7fc8335fec9da5f84e60236029bb4a64a469a021 | 20 |
  10. ---------------------------------------------------------------------------------------------

登录账户2的控制台,查看共识节点列表。

  1. [group:1]> getSealerList
  2. [
  3. 01cd46feef2bb385bf03d1743c1d1a52753129cf092392acb9e941d1a4e0f499fdf6559dfcd4dbf2b3ca418caa09d953620c2aa3c5bbe93ad5f6b378c678489e,
  4. 279c4adfd1e51e15e7fbd3fca37407db84bd60a6dd36813708479f31646b7480d776b84df5fea2f3157da6df9cad078c28810db88e8044741152eb037a19bc17,
  5. 320b8f3c485c42d2bfd88bb6bb62504a9433c13d377d69e9901242f76abe2eae3c1ca053d35026160d86db1a563ab2add127f1bbe1ae96e7d15977538d6c0fb4,
  6. c26dc878c4ff109f81915accaa056ba206893145a7125d17dc534c0ec41c6a10f33790ff38855df008aeca3a27ae7d96cdcb2f61eb8748fefe88de6412bae1b5
  7. ]

查看观察节点列表:

  1. [group:1]> getObserverList
  2. []

将第一个nodeID对应的节点设置为观察节点:

  1. [group:1]> addObserver 01cd46feef2bb385bf03d1743c1d1a52753129cf092392acb9e941d1a4e0f499fdf6559dfcd4dbf2b3ca418caa09d953620c2aa3c5bbe93ad5f6b378c678489e
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> getObserverList
  7. [
  8. 01cd46feef2bb385bf03d1743c1d1a52753129cf092392acb9e941d1a4e0f499fdf6559dfcd4dbf2b3ca418caa09d953620c2aa3c5bbe93ad5f6b378c678489e
  9. ]
  10. [group:1]> getSealerList
  11. [
  12. 279c4adfd1e51e15e7fbd3fca37407db84bd60a6dd36813708479f31646b7480d776b84df5fea2f3157da6df9cad078c28810db88e8044741152eb037a19bc17,
  13. 320b8f3c485c42d2bfd88bb6bb62504a9433c13d377d69e9901242f76abe2eae3c1ca053d35026160d86db1a563ab2add127f1bbe1ae96e7d15977538d6c0fb4,
  14. c26dc878c4ff109f81915accaa056ba206893145a7125d17dc534c0ec41c6a10f33790ff38855df008aeca3a27ae7d96cdcb2f61eb8748fefe88de6412bae1b5
  15. ]

登录账户3的控制台,将观察节点加入共识节点列表。

  1. [group:1]> addSealer 01cd46feef2bb385bf03d1743c1d1a52753129cf092392acb9e941d1a4e0f499fdf6559dfcd4dbf2b3ca418caa09d953620c2aa3c5bbe93ad5f6b378c678489e
  2. {
  3. "code":-50000,
  4. "msg":"permission denied"
  5. }
  6. [group:1]> getSealerList
  7. [
  8. 279c4adfd1e51e15e7fbd3fca37407db84bd60a6dd36813708479f31646b7480d776b84df5fea2f3157da6df9cad078c28810db88e8044741152eb037a19bc17,
  9. 320b8f3c485c42d2bfd88bb6bb62504a9433c13d377d69e9901242f76abe2eae3c1ca053d35026160d86db1a563ab2add127f1bbe1ae96e7d15977538d6c0fb4,
  10. c26dc878c4ff109f81915accaa056ba206893145a7125d17dc534c0ec41c6a10f33790ff38855df008aeca3a27ae7d96cdcb2f61eb8748fefe88de6412bae1b5
  11. ]
  12. [group:1]> getObserverList
  13. [
  14. 01cd46feef2bb385bf03d1743c1d1a52753129cf092392acb9e941d1a4e0f499fdf6559dfcd4dbf2b3ca418caa09d953620c2aa3c5bbe93ad5f6b378c678489e
  15. ]

添加共识节点失败,账户3没有权限管理节点。现在只有账户2有权限将观察节点加入共识节点列表。

授权修改系统参数

控制台提供2个关于修改系统参数的命令,如下表所示:

命令名称命令参数功能
setSystemConfigByKeykey value设置键为key,值为value的系统参数
getSystemConfigByKeykey根据key查询value
  • 注意: 目前支持键为tx_count_limit和tx_gas_limit的系统参数设置。其中setSystemConfigByKey命令受权限控制,getSystemConfigByKey命令不受权限控制。

登录账户1的控制台,授权账户2拥有修改系统参数的权限。

  1. [group:1]> grantSysConfigManager 0x7fc8335fec9da5f84e60236029bb4a64a469a021
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listSysConfigManager
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0x7fc8335fec9da5f84e60236029bb4a64a469a021 | 23 |
  10. ---------------------------------------------------------------------------------------------

登录账户2的控制台,修改系统参数tx_count_limit的值为2000。

  1. [group:1]> getSystemConfigByKey tx_count_limit
  2. 1000
  3. [group:1]> setSystemConfigByKey tx_count_limit 2000
  4. {
  5. "code":0,
  6. "msg":"success"
  7. }
  8. [group:1]> getSystemConfigByKey tx_count_limit
  9. 2000

登录账户3的控制台,修改系统参数tx_count_limit的值为3000。

  1. [group:1]> setSystemConfigByKey tx_count_limit 3000
  2. {
  3. "code":-50000,
  4. "msg":"permission denied"
  5. }
  6. [group:1]> getSystemConfigByKey tx_count_limit
  7. 2000

设置失败,账户3没有修改系统参数的权限。

授权账户写用户表

通过账户1授权账户3可以写用户表t_test的权限。

  1. [group:1]> grantUserTableManager t_test 0xd86572ad4c92d4598852e2f34720a865dd4fc3dd
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listUserTableManager t_test
  7. ---------------------------------------------------------------------------------------------
  8. | address | enable_num |
  9. | 0xd86572ad4c92d4598852e2f34720a865dd4fc3dd | 6 |
  10. ---------------------------------------------------------------------------------------------

登录账户3的控制台,在用户表t_test插入一条记录,然后查询该表的记录。

  1. [group:1]> call TableTest.sol 0xfe649f510e0ca41f716e7935caee74db993e9de8 insert "fruit" 1 "apple"
  2. transaction hash:0xc4d261026851c3338f1a64ecd4712e5fc2a028c108363181725f07448b986f7e
  3. ---------------------------------------------------------------------------------------------
  4. Event logs
  5. ---------------------------------------------------------------------------------------------
  6. InsertResult index: 0
  7. count = 1
  8. ---------------------------------------------------------------------------------------------
  9. [group:1]> call TableTest.sol 0xfe649f510e0ca41f716e7935caee74db993e9de8 select "fruit"
  10. [[fruit], [1], [apple]]

登录账户2的控制台,更新账户3插入的记录,并查询该表的记录。

  1. [group:1]> call TableTest.sol 0xfe649f510e0ca41f716e7935caee74db993e9de8 update "fruit" 1 "orange"
  2. {
  3. "code":-50000,
  4. "msg":"permission denied"
  5. }
  6. [group:1]> call TableTest.sol 0xfe649f510e0ca41f716e7935caee74db993e9de8 select "fruit"
  7. [[fruit], [1], [apple]]

更新失败,账户2没有权限更新用户表t_test。

  • 通过账户1撤销账户3写用户表t_test的权限。
  1. [group:1]> revokeUserTableManager t_test 0xd86572ad4c92d4598852e2f34720a865dd4fc3dd
  2. {
  3. "code":0,
  4. "msg":"success"
  5. }
  6. [group:1]> listUserTableManager t_test
  7. Empty set.

撤销成功。

  • 注意: 此时没有账户拥有对用户表t_test的写权限,因此对该表的写权限恢复了初始状态,即所有账户均拥有对该表的写权限。如果让账户1没有对该表的写权限,则可以通过账号1授权另外一个账号,比如账号2拥有该表的写权限实现。