openzeppelin学习笔记 - 4

之前说了openzeppelin提供了Roleslibrary,之外它还提供了4种角色,都是基于Roles的实现,基本上大同小异(我觉得除了名子其他没什么区别)

  • CapperRole - 可以设置发币上限的角色
  • MinteRole - 发币角色,拥有发币的权限
  • PauserRole - 暂停角色,拥有暂停合约的功能
  • SignerRole - 不太清楚含义

他们的实现都差不多,我们以MinterRole为例来看看:

MinterRole

拥有发币权限的角色

事件

  • 添加发币者
1
event MinterAdded(address indexed account)
  • 删除发币者
1
event MinterRemoved(address indexed account)
装饰器

  • 仅允许发币者执行
1
modifier onlyMinter()
方法

  • 是否具有发币者角色
1
function isMinter(address account) public view returns (bool)
  • 添加发币者角色
1
function addMinter(address account) public onlyMinter
  • 删除发币者角色
1
function renounceMinter() public
合约代码

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
pragma solidity ^0.4.24;
import "../Roles.sol";
contract MinterRole {
// 扩展Roles结构体
using Roles for Roles.Role;
// 添加账户发币者角色
event MinterAdded(address indexed account);
// 删除账户发币者角色
event MinterRemoved(address indexed account);
// 发币者角色账户列表
Roles.Role private minters;
/**
* 默认合约部署者具有发币角色
*/
constructor() internal {
_addMinter(msg.sender);
}
/**
* 仅限发币者可以执行
*/
modifier onlyMinter() {
require(isMinter(msg.sender));
_;
}
/**
* @dev 是否是发币者
*/
function isMinter(address account) public view returns (bool) {
return minters.has(account);
}
/**
* @dev 添加发币者
*/
function addMinter(address account) public onlyMinter {
_addMinter(account);
}
/**
* @dev 删除发币者
*/
function renounceMinter() public {
_removeMinter(msg.sender);
}
function _addMinter(address account) internal {
minters.add(account);
emit MinterAdded(account);
}
function _removeMinter(address account) internal {
minters.remove(account);
emit MinterRemoved(account);
}
}