在 solidity 智能合约中删除 require(_balances[user] >= amount)
Removing require(_balances[user] >= amount) in solidity smart contract
如果我从传递函数中删除 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;
}
这取决于你的solidity版本和balances
的数据类型。
我假设 balances
是 mapping (address => uint256)
,因为这是大多数令牌使用的。至于solidity版本,我要分开回答。
稳固性 <= 0.7.6
不要删除检查。如果这样做,您将函数打开到整数 underflow/overflow 漏洞。
示例:
_balances[msg.sender]
是 50
amount
是 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 开发)的著名库,它也可以帮助您防止 underflow/overflow。使用示例:
// reverts if underflow would happen
_balances[msg.sender] = _balances[msg.sender].sub(amount);
坚固度 >= 0.8.0
取消支票是安全的。 Solidity 0.8+ 默认执行 underflow/overflow 检查,如果 underflow/overflow 发生,交易将恢复。
如果我从传递函数中删除 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;
}
这取决于你的solidity版本和balances
的数据类型。
我假设 balances
是 mapping (address => uint256)
,因为这是大多数令牌使用的。至于solidity版本,我要分开回答。
稳固性 <= 0.7.6
不要删除检查。如果这样做,您将函数打开到整数 underflow/overflow 漏洞。
示例:
_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 开发)的著名库,它也可以帮助您防止 underflow/overflow。使用示例:
// reverts if underflow would happen
_balances[msg.sender] = _balances[msg.sender].sub(amount);
坚固度 >= 0.8.0
取消支票是安全的。 Solidity 0.8+ 默认执行 underflow/overflow 检查,如果 underflow/overflow 发生,交易将恢复。