智能合约权限管理

1. 合约内授权

业务智能合约内,可能会针对某些用户给予指定的数据访问权,或者调用方法的权限,涉及到合约内数据的授权。以下是solidity伪代码,适用于该业务合约由权威机构管理,也就是存在administrator角色统一分配权限,其他只能作为参与方访问授权数据。相应的可以参考微众银行权限治理合约,将用户权限按照分组在权限合约里统一管理,应用合约接口粒度的权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
contract Admin {
address public administrator;

modifier admin() {
require(msg.sender == administrator, "Only called by administrator");
_;
}

function transferAdmin(address newAdministrator) admin public {
administrator = newAdministrator;
}
}

// 业务合约(包含权限管理)
contract Service is Admin {
mapping(uint256 => mapping(address => bool)) private _authorized;

constructor() public {
administrator = msg.sender;
}

// 只有administrator才有权限授权给userAddr
function authourize(uint256 itemID, address userAddr) admin public {
_authorized[itemID][userAddr] = true;
}

// 授权用户才能操作特定数据
function doSth(uint256 itemID) admin public {
require(_authorized[itemID][msg.sender] == true, "Unthorized");
// do something
}

}

2. 应用授权

回顾上一篇文章提到的钱包(应用商店)拓扑,平台会存在共用的合约,用户通过某个应用(类似于dapp)来调用这个平台合约(只能通过用户的身份而不是应用的身份,也就是msg.sender是用户身份合约地址)。此处涉及到两个验证,一是验证该应用被平台授权调用该合约,二是验证该用户被该应用授权可以通过来调用该合约。可以遵循以下三个步骤:

  1. 用户需要在应用获得授权,应用会在用户的身份合约里添加标签(可以理解为应用对用户的授权签名)。
  2. 当用户请求平台合约时,平台合约会根绝用户的身份地址msg.sender去查找到用户的身份合约,并且从中读到相应的应用,以及应用打上的标签。
  3. 平台合约会到监管授权合约中去认证,确认应用已授权后,平台合约校验用户身份合约里应用标签的真实性。则用户可以调用此平台合约。