如果我从传递函数中删除 require(this) 以节省 gas 并将其留给用户没有足够的数量时产生的错误,它会以任何不良方式影响函数吗?
function transfer(address recipient, uint256 amount) external returns (bool) {
require(_balances[msg.sender] >= amount)
_balances[msg.sender] -= amount;
_balances[recipient] += amount;
return true;
}
function transfer(address recipient, uint256 amount) external returns (bool) {
_balances[msg.sender] -= amount;
_balances[recipient] += amount;
return true;
}
答案 0 :(得分:2)
这取决于您的 Solidity 版本和 balances
的数据类型。
我将假设 balances
是 mapping (address => uint256)
,因为这是大多数令牌使用的。至于 Solidity 版本,我将拆分答案。
请勿删除检查。如果删除,则会打开该函数的整数下溢/溢出漏洞。
示例:
_balances[msg.sender]
是 50amount
是 100所以 50-100 通常会导致 -50。由于 uint
中没有负数,它环绕零,并继续从数据类型中可用的最大数减去。在 uint256
的情况下,最大数量为 2^256 - 1
(大约 10^77
)。
如果没有检查,_balances[msg.sender] -= amount;
会下溢,导致发送方没有 -50
而是 2^256 - 51
令牌。你不想要的。
阅读有关 https://swcregistry.io/docs/SWC-101 上的漏洞的更多信息
编辑:有一个著名的库,称为 SafeMath(由 OpenZeppelin),它也可以帮助您防止下溢/上溢。示例使用:
// reverts if underflow would happen
_balances[msg.sender] = _balances[msg.sender].sub(amount);
取消支票是安全的。 Solidity 0.8+ 默认执行下溢/上溢检查,如果发生下溢/上溢,事务将恢复。