漫威的《复仇者联盟》里的七个宝石分别有对应的作用:空间之石可以瞬移,时间之石可以穿越,灵魂之石可以操控灵魂,现实之石可以实现梦境,力量之石可以拷贝物理攻击能力,心灵之石可以进入他人思维,精神之石可以增强心灵的力量。而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;
}
}
下面是本次实验所配套的视频教程:
