基于角色的权限控制 — FISCO BCOS v2.9.0 文档 (fisco-bcos-documentation.readthedocs.io)https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/security_control/chain_governance.htmlFISCO的账户权限控制分为基于角色的权限控制和基于表的权限控制。本文内容是基于角色的权限控制。
本博客仅用于个人记录学习过程,对于更详尽全面的教程内容、需求与设计等,请参考官方文档而非本文。
操作系统:centOS 7.5
FISCO版本:2.9.2
控制台所在目录:~/fisco/console
2.5.0版本开始,提供一种基于角色的权限控制模型,原来的链管理员相当于当前的治理委员会委员角色,拥有链治理相关的操作权限。用户不需要去具体关注底层系统表对应的权限,只需要关注角色的权限即可。
控制台1.x版本和2.6+版本返回的信息略有区别,官方使用的应该是1.x版本的控制台,但这并不影响学习参考。
权限控制示例账户
新建账户1,并登录。
# 打开终端,创建账户1(当前目录在~/fisco/console下)
./get_account.sh
# 创建成功后,打开一个新的终端,登录这个账户1(当前目录在~/fisco/console下)
# 命令为:./start.sh 1 -pem ${对应账户的Private Key}
# 每个Private Key都不同,根据自己生成的Private Key去启动(不要直接拷贝示例的)
./start.sh 1 -pem accounts/0xbc16c434fc0acb250c7d63a747db83bbd6877861.pem
使用PEM格式私钥文件启动
使用指定的pem文件的账户启动,输入参数:群组号、-pem、pem文件路径
./start.sh 1 -pem accounts/0xebb824a1122e587b17701ed2e512d8638dfb9c88.pem
账户2,、账户3同理。
一、委员角色
委员新增、撤销与查询
链初始状态,没有任何权限账户记录。
我们添加账户1、账户2为委员,账户3为普通用户。
进行如下测试:账户3不能操作委员权限,而账户1、2可以。
委员的权限包括治理投票、增删节点、冻结解冻合约、冻结解冻账号、修改链配置和增删运维账号。
添加账户1为委员
# 在账户1对应的FISCO控制台下输入命令,注意要输入账户1的Account Address
grantCommitteeMember 0xbc16c434fc0acb250c7d63a747db83bbd6877861
# 查看委员会成员,返回对应的地址和enable_num
listCommitteeMembers
在官方文档中,返回"code":0;而2.9.2(也就是我使用的这个版本)code返回为1。
这是因为控制台版本不同造成的情况:控制台1.x版本下返回code为0;而控制台2.6+版本下,投票且决议通过(即生效)时返回code为1,投票但票数不够(因此决议没有通过,操作暂未生效)返回code为0。
grantCommitteeMember
添加治理委员会委员,如果当前没有委员,则直接添加成功,否则判断投票账号是否有权限投票,如有则记录投票并检查投票是否生效。参数:
账号地址:投票添加该账号为委员
使用账户1添加账户2为委员
增加委员需要链治理委员会投票,有效票大于阈值才可以生效。
# 在账户1对应的FISCO控制台下输入命令,注意要输入账户2的Account Address
grantCommitteeMember 0x4b32511e2c32d0872cb6537a1a1d94a32e6640f1
# 查看委员会成员,可发现此次添加是成功的
listCommitteeMembers
在官方文档中,返回"code":0;而2.9.2版本code返回为1。
验证账号3无权限执行委员操作
在账号3的控制台中尝试进行链配置操作:
# 运行setSystemConfigByKey,以键值对方式设置系统参数
# tx_count_limit:区块最大打包交易数
setSystemConfigByKey tx_count_limit 100
撤销账号2的委员权限
由于默认投票生效阈值50%,两位委员的票数默认为1,需要两位委员都投票同意(有效票/总票数=2/2=1>0.5,超过阈值),才可以撤销账号2的委员权限。
账号1投票撤销账号2的委员权限
# 在账号1的控制台下:
revokeCommitteeMember 0x4b32511e2c32d0872cb6537a1a1d94a32e6640f1
# 查看委员会成员,可发现账号2仍然是委员
listCommitteeMembers
账号2投票撤销账号2的委员权限
# 在账号2的控制台下:
revokeCommitteeMember 0x4b32511e2c32d0872cb6537a1a1d94a32e6640f1
# 查看委员会成员,可发现账号2不再是委员
listCommitteeMembers
在官方文档中,返回"code":0;而2.9.2版本code返回为1(后文不再强调)。
委员权重修改
再在上述基础上,添加账户3为委员。然后更新委员1的票数为2。
由于默认投票生效阈值50%,两位委员的票数默认为1,需要两位委员都投票同意(有效票/总票数=2/2=1>0.5,超过阈值),才可以更新委员1的票数为2。
使用账号1的控制台添加账号3为委员
# 在账号1的控制台下:
revokeCommitteeMember 0xc69914674e8ddde4f0b602373d8f2dc7ec5a6e67
使用账号1的控制台投票更新账号1的票数为2
#在账户1的控制台下:
updateCommitteeMemberWeight 0xbc16c434fc0acb250c7d63a747db83bbd6877861 2
#查看账号1的票数(我这里忘查看了,就没截图)
queryCommitteeMemberWeight 0xbc16c434fc0acb250c7d63a747db83bbd6877861
使用账号3的控制台投票更新账号1的票数为2
#在账户2的控制台下:
updateCommitteeMemberWeight 0xbc16c434fc0acb250c7d63a747db83bbd6877861 2
#查看账号1的票数(我这里忘查看了,就没截图)
queryCommitteeMemberWeight 0xbc16c434fc0acb250c7d63a747db83bbd6877861
委员投票生效阈值修改
账户1和账户3为委员,账号1有2票,账号3有1票。
使用账号1添加账号2为委员,由于2/3>0.5所以直接生效。
使用账号1和账号2,更新生效阈值为75%。
我之前以为阈值是根据委员权重的变更自动变更的,但其实这需要我们自己设定……
账户1添加账户2为委员
#在账号1控制台下:
grantCommitteeMember 0x4b32511e2c32d0872cb6537a1a1d94a32e6640f1
使用账户1控制台投票更新生效阈值为75%
#在账号1控制台下:
updateThreshold 75
#查看阈值
queryThreshold
使用账户2控制台投票更新生效阈值为75%
#在账号2控制台下:
updateThreshold 75
#查看阈值
queryThreshold
updateThreshold
投票更新生效阈值,判断投票账号是否是委员,是则计票并判断是否生效。参数:
生效阈值:取值范围[0,99]
二、运维角色
运维新增、撤销与查询
委员可以添加运维。
运维角色的权限包括部署合约、创建表、冻结解冻所部署的合约、使用CNS服务。
基于职责权限分离的设计,委员角色不能兼有运维的权限。
生成一个新的账号4
# 打开终端,创建账户4(当前目录在~/fisco/console下)
./get_account.sh
添加账号4为运维角色
#可以在委员(例如账户1)的控制台下添加添加运维角色
grantOperator 0x1b9b037494640505bb9523727dab7f1425c2c29e
#查看运维成员
listOperators
使用运维账号(账户4)部署HelloWorld
# 打开一个新的终端,在目录~/fisco/console下登录账户4
./start.sh 1 -pem accounts/0x1b9b037494640505bb9523727dab7f1425c2c29e.pem
#在账户4的控制台下部署合约HelloWorld
deploy HelloWorld
使用账号1(委员)部署HelloWorld
由于委员角色不能兼有运维的权限,所以账号1(委员)部署HelloWorld失败
#在账户1的控制台下,尝试部署合约HelloWorld
deploy HelloWorld
账号1(委员)撤销账号4(运维)的运维权限
#在账户1的控制台下:
revokeOperator 0x1b9b037494640505bb9523727dab7f1425c2c29e
#查看运维成员:
listOperators