3. 权限管理
3.1. 合约访问控制列表ACL
ACL(Access Control List)是XuperChain提供的重要的权限管理方法,其主要对于合约方法的读写做控制,包括系统合约和用户合约。
如果把合约账号当作一家股份制公司,那么ACL便是公司股东投票的机制,ACL可以规定合约账号背后各“股东”账号的权重,只有当“股东”签名的权重之和大于设定阈值时操作才会有效地进行。
XuperChain 中ACL配置格式如下:
|
了解了访问控制列表的概念,下面我们会进一步详细介绍ACL的细节。
3.1.1. 合约账号创建
XuperChain的客户端工具提供了新建账号的功能,基本用法如下:
|
这里的 account.des 就是创建账号所需要的配置了,内容如下:
|
命令运行后就会调用xchain的系统合约功能 NewAccount
创建一个名为 XC1111111111111111@xuper
(如果链名字为xuper)的账号
除了上述方法,我们还提供了一个比较简易的方式来创建合约账号,命令如下:
|
上述命令也会创建一个名为 XC1111111111111111@xuper
的账号,由于我们没有制定ACL的具体内容,其ACL被赋值为默认状态,即背后有权限的账号只有当前节点上默认账号一个(地址默认位于 data/keys/address)。
重要
创建合约账号的操作需要提供手续费,需要按照命令行运行结果给出的数值,添加一个不小于它的费用(使用 –fee 参数)。
3.1.2. 合约账号基本操作
1. 查询账号ACL
XuperChain的客户端工具提供了ACL查询功能,只需如下命令。
|
查询合约账号ACL
2. 查询账号余额
合约账号查询余额和普通账号类似,只是命令行的参数有些许变化。
|
使用此命令即可查询 XC1111111111111111@xuper
的余额。
查询合约账号余额
3. 修改账号ACL
修改ACL的配置和创建账号的配置类似。
|
修改ACL的操作,需要符合当前ACL中设置的规则,即需要具有足够权重的账号签名。
需要新建文件添加需要签名的地址,默认acl文件路径是:./data/acl/addrs 。 ./data/acl/addrs 示例(这里为原ACL地址,即AK1,AK2): XC9999999999999999@xuper/9LArZSMrrRorV7T6h5T32PVUrmdcYLbug XC9999999999999999@xuper/gLAdZSMtkforV7T6h5TA14VUrfdcYLbuy
我们首先生成一个多重签名的交易。
|
成多重签名交易
这样就会生成一个默认为 tx.out
的文件,之后使用原ACL中的账号对其进行签名。
|
签名交易
最后把生成的 tx.out
发出去。
|
发送交易
至此便完成了ACL的修改。
重要
生成交易等操作中,会出现需要手续费的情况,需要按要求添加 –fee 参数。
重要
使用“简易”方式创建的合约账号,修改ACL生成交易时,需要添加节点账号的地址路径 –multiAddrs data/keys/address。
3.2. 合约方法 ACL
合约方法 ACL 允许某个合约方法只能被满足特定条件的账号调用。
合约方法 ACL 的设置也是通过多签来完成。
准备desc文件setMethodACL.desc
{
"module_name": "xkernel",
"method_name": "SetMethodAcl",
"args" : {
"contract_name": "counter",
"method_name": "increase",
"acl": "{\"pm\": {\"rule\": 1,\"acceptValue\": 1.0},\"aksWeight\": {\"TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY\": 1}}"
}
}
参数说明:
module_name: 模块名称,用固定值xkernel
method_name :方法名称,用固定值SetMethodAcl
contract_name:合约名称
method_name:合约方法名称
acl:合约方法的acl
准备 ACL 描述文件
以使用 XC1111111111111111@xuper 部署的 counter 合约为例,合约账号 ACL 里 只有 1 个 AK,所以在data/acl/addrs中添加1行
$ echo "XC1111111111111111@xuper/TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY" > data/acl/addrs
如果合约账号 ACL 有多个 AK,按序添加即可。
生成交易并发送
# 生成交易
xchain-cli multisig gen --desc ./setMethodACL.desc --fee 1
# 对交易签名
xchain-cli multisig sign --output sign.out
# 发送交易
xchain-cli multisig send sign.out sign.out
查看合约方法ACL
$ xchain-cli acl query --contract counter --method increase
{
"pm": {
"rule": 1,
"acceptValue": 1
},
"aksWeight": {
"TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY": 1
}
}
confirmed
3.3. 平行链群组
平行链群组提供的是对某一条平行链的读权限和操作该权限的写权限的控制。平行链和群组是彼此相辅相成的概念,在创建平行链时,会根据输入创建该平行链的群组合约,用户后续可通过系统合约对群组进行修改。
重要
XuperChain需要与Xuper-Front联合使用才可以控制平行链的权限,该方案面向的是联盟链场景。单独的XuperChain进程,通过调用系统合约只能对主链群组相关Key进行修改,并不影响XuperChain节点的使用。具体可见 平行链、群组和CA中心 。
3.3.1. 平行链群组的创建
平行链群组的创建只能在平行链创建时发生。若在平行链参数中指定 group
参数,则平行链群组根据该参数创建,否则走默认模式,即平行链群组默认归合约发起节点拥有。
|
群组合约的参数如下。
|
3.3.2. 平行链群组的修改
有平行链群组管理员身份的XuperChain节点和账户才可以对该平行链群组做修改。
|
3.3.3. 平行链群组的查看
仅有平行链管理员身份或者平行链查询者身份的节点和账户才可以对该平行链群组做查询。
|