// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
//做一个管理员更换功能
//分析,首先要有一个存储地址的变量
contract chAdmin{
//创建一个变量来存储管理员地址
address public admin_address \= msg.sender;
//初始化合约部署者管理员,也就是默认管理员
constructor(address newadd) {
require(admin_address \== newadd,"not adminAdd");
}
//创建一个函数,用于更改管理员地址
function change_admin(address _admin) public {
require(_admin != address(0),"404not");
admin_address \= _admin;
}
}
//以上代码,有个错误,没有做权限控制,
//任何人都可以调用函数这不是我想要的,我想要的是只能管理员调用函数来切换管理员
contract ch2Admin{
//创建一个变量来存储部署者,也就是管理员地址
address adminAddress;
//初始化将管理员赋值给默认变量
constructor() {
adminAddress \= msg.sender;
}
//创建一个控制器检测是否为管理员
modifier isAdmin(){
//知识点,这个地方跟常识中的编程不一样, 如果相等就执行后面的下划线代码,如果不相等,就执行字符串中的内容
require(msg.sender \== adminAddress,"not adminAdd");
_;
}
//创建一个函数用于更换管理员地址
function change_admin2(address admin2) public isAdmin(){
//address(0) 零地址(0x0)不同。零地址表示以太坊中无效或不存在的帐户。
require(admin2 != address(0),"403not");
adminAddress \= admin2;
}
//查看管理员地址
function getadmin() public view returns (address){
return adminAddress;
}
/**
为什么在 modifier onlyAdmin 中一定要用 msg.sender 而不能用 adminAddress:
1. 安全性考虑:
msg.sender 代表的是调用合约函数的地址,而 adminAddress 则是存储在合约中的管理员地址。
如果直接使用 adminAddress 进行判断,那么任何人都可以修改合约中的 adminAddress 值,从而获得管理员权限。
这显然是不安全的,可能会导致合约被恶意控制。
2. 功能性考虑:
在某些情况下,管理员可能需要将合约的控制权移交给其他地址。例如,管理员可能离职或需要将权限交接给其他人。
如果使用 adminAddress 进行判断,那么管理员就无法将权限移交给其他人,因为 adminAddress 始终指向原来的管理员地址。
3. 代码逻辑:
msg.sender 是 Solidity 中内置的全局变量,可以直接使用,无需额外声明。
而 adminAddress 是合约中的变量,需要使用 this 关键字来访问。
使用 msg.sender 可以使代码更加简洁易懂。
*/

}