我查看了化合物的Timelock.sol合同,找到了这个函数。
function setDelay(uint delay_) public {
require(
msg.sender == address(this),
"Timelock::setDelay: Call must come from Timelock."
);
require(
delay_ >= MINIMUM_DELAY,
"Timelock::setDelay: Delay must exceed minimum delay."
);
require(
delay_ <= MAXIMUM_DELAY,
"Timelock::setDelay: Delay must not exceed maximum delay."
);
delay = delay_;
emit NewDelay(delay);
}这个函数不是在整个项目中的任何地方调用的,也不是在相同的契约中调用的,但它仍然需要msg.sender == address(this),我猜这实际上是不可能的。那么,这个方法将如何执行呢?
发布于 2022-12-19 06:26:29
Timelock契约的目的是限制管理员的权限,方法是强制一个带有预设延迟时间的两步进程。setDelay()函数与requires msg.sender == address(this)一起防止任何外部地址将自己设置为管理员,从而更改延迟时间,因为这被认为是一种利用漏洞,允许避开时间锁的延迟,从而有效地绕过所有timelock的安全保证。
发布于 2022-12-19 12:36:09
在语言中,msg.sender是一个内建变量,它引用合同调用方的地址,而address (此)是契约本身的地址。
您提供的代码检查msg.sender是否等于address(this),这意味着它检查合同调用方是否是合同本身。此检查用于确保执行合同的内部逻辑,而不是调用此函数的外部契约。
这一职能有可能是在合同内部而不是由外部合同内部调用的。在这种情况下,该函数将由契约中的其他函数调用,msg.sender将等于address( this )。
这一功能也有可能是由外部合同调用的,但从未实际用于该项目。在这种情况下,函数将永远不会被执行。
https://ethereum.stackexchange.com/questions/141468
复制相似问题