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; }
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"); }
}
|
2. 应用授权
回顾上一篇文章提到的钱包(应用商店)拓扑,平台会存在共用的合约,用户通过某个应用(类似于dapp)来调用这个平台合约(只能通过用户的身份而不是应用的身份,也就是msg.sender是用户身份合约地址)。此处涉及到两个验证,一是验证该应用被平台授权调用该合约,二是验证该用户被该应用授权可以通过来调用该合约。可以遵循以下三个步骤:
- 用户需要在应用获得授权,应用会在用户的身份合约里添加标签(可以理解为应用对用户的授权签名)。
- 当用户请求平台合约时,平台合约会根绝用户的身份地址msg.sender去查找到用户的身份合约,并且从中读到相应的应用,以及应用打上的标签。
- 平台合约会到监管授权合约中去认证,确认应用已授权后,平台合约校验用户身份合约里应用标签的真实性。则用户可以调用此平台合约。