当前位置:   article > 正文

【以太坊 Solidity】管理员读写权限/访问控制/角色控制_solidity 访问控制合约

solidity 访问控制合约

摘要

Solidity 语言的多继承中,若多个合约共同继承一个父合约,则这多个合约 共享 父合约中的变量和函数。

1.测试的智能合约

合约继承路线如下:

权限管理合约Authority
基类合约A
基类合约B
测试合约Test

1.1 权限管理合约

// SPDX-License-Identifier: GPL-3.0
// filename: authority.sol
pragma solidity ^0.8.18;  

contract Authority {
    address private OWNER;
    mapping(address => bool) private ADMIN;

    constructor() {
        OWNER = msg.sender;
        ADMIN[OWNER] = true; // !注意,此处意为授予合约拥有者管理员权限
    }

    modifier isOwner() {
        require(msg.sender == OWNER, unicode"非合约拥有者");
        _;
    }
    // 修饰函数,被修饰的函数仅管理员才可调用
    modifier isAdmin() {
        require(ADMIN[msg.sender] == true, unicode"无管理员权限");
        _;
    }

    function addAdmin(address addrs) public isOwner {
        ADMIN[addrs] = true;
    } 
    function removeAdmin(address addrs) public isOwner { 
        ADMIN[addrs] = false;
    }
}
  • 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

1.2 继承权限管理合约的基类合约

// SPDX-License-Identifier: GPL-3.0
// filename: base.sol
pragma solidity ^0.8.18;  
import { Authority } from "./authority.sol";

// 继承 Authority 合约,继而使用 isAdmin() 修饰函数
contract A is Authority {
    string a = "aaa";
	// 仅管理员才可调用 getAstring()
    function getAstring() isAdmin public view returns (string memory) {
        return a;
    }
}

contract B is Authority {
    string b = "bbb"; 
    function getBstring() isAdmin public view returns (string memory) {
        return b;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

1.3 待测试的合约

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.18;  
import { A, B } from "./base.sol"; 

contract Test is A, B {  
    // 合约 Test 继承了 A 中的 a, getAstring() 以及
    //  B 中的 b, getBstring()
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.权限管理合约测试

2.1 正向测试:合约拥有者OWNER具有管理员权限

此时 合约 Authority 中的 构造函数 constructor() 中的 ADMIN[OWNER] = true,意为 OWNER 具有管理员权限。
Remix 中测试,Test 合约的部署者具有管理员权限,能正常调用继承的函数,如下:
在这里插入图片描述

2.2 反向测试:合约拥有者OWNER没有管理员权限

此步测试中将 合约 Authority 中的 构造函数 constructor() 中改为 ADMIN[OWNER] = false,意为 用户 OWNER 没有了管理员权限,测试测试结果如下:
在这里插入图片描述

3.总结

合约继承图:

权限管理合约Authority
基类合约A
基类合约B
测试合约Test

虽然 合约 A,B,Test 都直接或间接继承了 合约 Authority,但是 合约 A,B,Test 都 “ 共享 ” 了 合约 Authority 中的 变量 ADMIN函数 isAdmin() 等。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/273559
推荐阅读
相关标签
  

闽ICP备14008679号