一、使用modifier onlyowner来进行权限控制。在某一个场景下,我们希望只有合约的部署账户才有资格对num进行修改。首先我们利用构造函数,把合约的部署账户传入变量owner,然后利用修饰器对函数的调用账户是否和合约的部署账户一致进行判断require(msg.sender==owner),比如在图片中,合约部署时使用外部账户1,调用函数时使用外部账户2,那么在点击1处changeNum时,2处就会报错。
pragma solidity^0.5.0;
contract aa{
address owner;
uint num=0;
constructor()public{owner=msg.sender;
}
modifier onlyowner{
require(msg.sender==owner);
_;
}
function changeNum(uint _num)public onlyowner{
num=_num;
}
}
![(https://img-blog.csdnimg.cn/20200110160642794.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Fpbm1pYW9mdQ==,size_16,color_FFFFFF,t_70)
二、在modifier 中传入参数进行权限控制。在某些场景下,我们需要在多个函数中利用修饰器进行权限控制,同时各个函数的权限控制的参数不同,这种情况下,我们可以在modifier 中传入参数。在下面的例子中,我们希望等级大于2的玩家拥有修改名字的权限,等级大于10的玩家拥有修改名字的权限,可以在 modifier control (uint lowestlevel)后面加入lowestlevel这个参数。在本例中,玩家等级为6.所以拥有changeName权限,不拥有changeAge权限,图片中1处不返回年纪,2处返回姓名。
pragma solidity^0.5.0;
contract motest{
uint public level=6;
string public name;
uint public age;
modifier control (uint lowestLevel){
require(level>=lowestLevel);
_;
}
function changeName()public control(2){
name="qmf";
}
function changeAge()public control(10){
age=18;
}
}
三、注意事项,在定义modifier 时,在require的下一行,一定要输入_;否则编译会通不过。