实验4.7 函数修饰器

漫威的《复仇者联盟》里的七个宝石分别有对应的作用:空间之石可以瞬移,时间之石可以穿越,灵魂之石可以操控灵魂,现实之石可以实现梦境,力量之石可以拷贝物理攻击能力,心灵之石可以进入他人思维,精神之石可以增强心灵的力量。而Soldity中的modifier就像这些宝石一样,可以有多种的功能。而被修饰的函数也会获得相应的功能与逻辑。Modifier的修饰往往在代码中占据着重要的地位:如权限修饰。

实验目的

1. 明白modifier的作用。

2. 知道modifier是否可传参。

3. 了解modifier多重修饰的执行顺序。

实验要求

1. 编译部署示例1中的代码,调用num与ower变量,查看结果是否为0与你部署合约的账户地址。查看被修改器onlyOwner修饰的函数changeIt与修改器onlyOwner的代码逻辑。尝试用部署合约的账户地址调用函数changeIt,输入参数10,然后查看num的值是否改变。再尝试切换另一个账户地址,调用函数changIt,输入参数20,查看是否调用成功。操作完成后,思考修改器modified的作用。

2. 查看示例2,这是一个简单的游戏系统。里面规定了等级系统,50级可以获得88金币,200级可以用88金币激活大招。代码中默认的等级是200级。所以这两个要求是可以实现的。请你编译部署示例2中的代码。先调用函数getMoneyAndBianShen查看金币与大招是否为0和false。然后调用函数addMoney,再调用函数getMoneyAndBianShen查看金币值是否变化。最后调用函数BianShen,再调用函数getMoneyAndBianShen查看大招是否兑换成功。请你仿照这两个等级函数补充函数getArms:满300级可以激活一个武器,补充函数returnArms:师尊可以返回查询账户所拥有的武器。

3. 请编译部署示例3的代码。思考被两个修改器mod1与mod2修饰的函数test,调用执行后,a最终的值为多少?思考完后,先查看a的初始值是否为0,然后调用函数test,再调取a的值,检查最终的值为多少。思考modifier多重修饰时函数代码逻辑的执行顺序是怎样的?

以下是本次实验所使用到的测试代码,请使用remix编辑器完成该实验

// 示例1
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; 
 
contract modifireTest{ 
    address public owner;
    uint public num = 0;
    constructor() public { 
        owner = msg.sender; 
    }
    //定义一个函数修改器 
modifier onlyOwner{ 
// 不符合条件时,则抛出异常 
        require(msg.sender == owner, 
        'It is only allowed to be called by the contract owner!');         
        _;  //修饰函数时,函数被插入到'_;'位置       
    }
    function changeIt(uint _num) public onlyOwner{
        num = _num;
    }
}
// 示例2
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; 
 
contract modifireGame { 
    uint level = 200;   // 游戏等级
    uint money;     // 金币
    bool DaZhao;          // 大招状态
    
    modifier modifyLevel(uint _inputLevel){
        require(level >= _inputLevel);
        _;     
    }
    function addMoney() public modifyLevel(50){
        // require(level >= 50); 
        money = 88;     
    }
    function BianShen() public modifyLevel(200){ 
        // require(level >= 200);
        money = 0; 
        DaZhao = true;      
    }
    function getMoneyAndBianShen() public view returns(uint,bool){
        return (money,DaZhao);      
}
function addLevel() public {
    level += 100;
} 
//请你补充该函数,实现满300级得到一个武器。
//function getArms().....
//补充该函数,使之可查询账户所拥有的武器
//function returnArms()
}
//示例3
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract modifierOder {
    uint256 public a;
    modifier mod1{
        a = 3;
        _;
        a = 333;
    }
     modifier mod2{
         a = 9;
         _;
         a = 999;
    } 
    function test() public mod1 mod2{
        a = 666;
    }
}

下面是本次实验所配套的视频教程: