1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【以太坊 Solidity】管理员读写权限/访问控制/角色控制

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

时间:2022-11-12 07:55:28

相关推荐

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

摘要

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

1.测试的智能合约

合约继承路线如下:

1.1 权限管理合约

// SPDX-License-Identifier: GPL-3.0// filename: authority.solpragma 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 继承权限管理合约的基类合约

// SPDX-License-Identifier: GPL-3.0// filename: base.solpragma 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.3 待测试的合约

// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.18; import {A, B } from "./base.sol"; contract Test is A, B {// 合约 Test 继承了 A 中的 a, getAstring() 以及// B 中的 b, getBstring()}

2.权限管理合约测试

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

此时合约 Authority中的构造函数 constructor()中的ADMIN[OWNER] = true,意为 OWNER 具有管理员权限。

经 Remix 中测试,Test 合约的部署者具有管理员权限,能正常调用继承的函数,如下:

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

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

3.总结

合约继承图:

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。