Solidity 中关键字 modifier 用于声明一个函数修改器。当它作用于一个函数上,可以在函数执行前或后(依赖于具体实现)预先执行modifier中的逻辑。
函数修改器中有一行代码只有下划线 _ ,在实际执行中,我们可以将被修饰函数的代码视为下划线处的代码。即,下划线实际上帮我们标记了被modifier修饰函数的执行位置。
在本图片中可以看到,在这个示例中,onlyOwner修饰器用于限制只有合约所有者可以调用该函数。如果条件满足就继续往下走,不满足返回字符串“Not owner”。“_;” 表示在执行修饰器之后将控制流交给被修饰函数的实际执行代码块。
通俗的可以理解为先直接require判断判断完成之后再让函数运行。
总之,下划线加分号(“_;”)在Solidity中表示一个空的代码块或匿名函数体,并在某些上下文中用于控制流的传递。
modifier的作用,在本图片中可以看到 使用modifier定义了两个方法onlyOwener和validAddress 在使用时可以直接写上名字来调用,相当于两个方法的内容被调用。
modifier noReentrancy() {
require(!locked,"No reentrancy");
locked = true;
_;
locked = false;
}
function decrement(uint i) public noReentrancy{
x -= i;
if (i >1) {
decrement( i- 1);
}
}
上图所示,由于modifier的使用先判断locked是不是为true,在进行其他函数代码运行,在函数decrement加上noReentrancy可以防止这次代码块还没有运行结束再次调用该函数,来防止重入攻击