在 solidity 中控制访问,一般是通过 modifier 修饰符方法来直接做。
那么对于稍复杂的多种访问控制,通常需要一个统一操作的模块化类库。
现在已经有了这样的类库存在,我们通过一个实现功能上增删改查的 library,然后在具体的合约中声明变量、按需使用。
建议参考 openzeppelin-contracts 的 Access Control 部分。
下面是演示片段:
pragma solidity ^0.5.0; import "@openzeppelin/contracts/access/Roles.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol"; contract MyToken is ERC20, ERC20Detailed { using Roles for Roles.Role; Roles.Role private _minters; Roles.Role private _burners; constructor(address[] memory minters, address[] memory burners) ERC20Detailed("MyToken", "MTKN", 18) public { for (uint256 i = 0; i < minters.length; ++i) { _minters.add(minters[i]); } for (uint256 i = 0; i < burners.length; ++i) { _burners.add(burners[i]); } } function mint(address to, uint256 amount) public { // Only minters can mint require(_minters.has(msg.sender), "DOES_NOT_HAVE_MINTER_ROLE"); _mint(to, amount); } function burn(address from, uint256 amount) public { // Only burners can burn require(_burners.has(msg.sender), "DOES_NOT_HAVE_BURNER_ROLE"); _burn(from, amount); } }