13-Solidity8.0-函数修改器 modifier

590 阅读1分钟

1 modifier

Solidity 中关键字 modifier 用于声明一个函数修改器。函数修改器的作用与 Spring 中的切面功能很相似,当它作用于一个函数上,可以在函数执行前或后(依赖于具体实现)预先执行modifier中的逻辑,以增强其功能。

官方文档:modifier可以改变函数的行为。可以被继承和重写;

执行函数时有时候也会对函数的参数有所要求,为了让函数内的代码更简洁我们便可以写在modifier中;

一个函数可能需要做多个检查,那么我们可以写多个modifier,调用时只需将每个modifier以空格隔开,检查顺序也就是modifier们的排列顺序;

2 _ 的作用

函数修改器中有一行代码只有下划线 _ ,在实际执行中,我们可以将被修饰函数的代码视为下划线处的代码。即,下划线实际上帮我们标记了被modifier修饰函数的执行位置。

image.png

pragma solidity ^0.8.7;

contract FunctionModifier{
    bool public paused;
    uint public count;

    function setPause(bool _paused) external {
        paused = _paused;
    }
   
   modifier whenNotPaused() {
       require(!paused,"paused");
       _;
   }
   function inc() external whenNotPaused {
       count += 1;
   }
  
   function dec() external whenNotPaused {
       count -= 1;
   }
    modifier cap(uint _x){
       require(_x < 100, "x >= 100");
       _;
   }

     function incBy(uint _x) external whenNotPaused cap(_x) {
       count += _x;
   }

   modifier sandwich() {
       //code here
       count += 10;
       _;
       //morec ode here
       count *=2;
   }

   function foo() external sandwich {
       count += 1;
   }
}


Solidity modifier 功能可以将一些通用的操作提取出来,提高编码效率,降低代码耦合性;