我遇到了修饰符中的下划线这个令人困惑的小情况,所以我想在这里发布它,以检查我的理解是否正确。
contract whatever{
bool public locked;
uint public x = 10;
modifier noReentrancy() {
require(!locked, "No reentrancy");
locked = true;
_;
locked = false;
}
function decrement(uint i) public noReentrancy {
x -= i;
if (i > 1) {
decrement(i - 1);
}
}
}修饰符函数中间的下划线对我来说是个小窍门。因此,我的理解是:当第一次运行修饰符时,锁定的值为真。然后下划线意味着运行函数代码,即x-= i.这将触发if条件,如果我>i,则在执行时( noReentry修饰符的点)将再次调用相同的函数,那么锁的值将为false,这将触发函数递减()以停止。那么,除非i的值是1或0(如果没有触发条件),那么在这种情况下,x的值总是10吗?
感谢您的耐心!
发布于 2022-12-07 01:31:42
下划线表示函数代码的其余部分。在下划线之前的任何内容都在函数代码之前运行,后面运行的都是函数代码。
(顺便说一句,在函数使用多个修饰符的情况下,它们按照代码中声明的顺序运行(而不是在函数声明中),例如:
modifier isA{
//...
}
modifier isB{
//...
}
function modified() isB isA external {
// isA is ran before isB
}绕道,回到答案。)
所以你对修饰语的理解是正确的。然而,您对代码的理解却不是这样。在这里,假设调用i > 1时,修饰符的开头将被运行,因此locked将被设置为true,然后x将减少,则if()条件将计算为true (i大于1),这将再次调用该函数,再次运行修饰符代码,而require语句require(!locked)将计算为false,因为将locked设置为false的其余修饰符尚未运行,调用将恢复。
https://ethereum.stackexchange.com/questions/140731
复制相似问题