[Contract] Solidity 多种访问控制 (Access Control) 实现方式

通过llama.cpp与羊驼聊天的网页界面- 详解 Serge 的启动使用

 

在 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);
    }
}

 

Refer:Solidity权限控制

Link:https://www.cnblogs.com/farwish/p/12563619.html

posted on 2020-03-25 16:49  ercom  阅读(765)  评论(0编辑  收藏  举报