在 Solidity 智能合约中删除 require(_balances[user] >= amount)

时间:2021-03-09 15:08:27

标签: solidity web3js

如果我从传递函数中删除 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;
    }

1 个答案:

答案 0 :(得分:2)

这取决于您的 Solidity 版本和 balances 的数据类型。

我将假设 balancesmapping (address => uint256),因为这是大多数令牌使用的。至于 Solidity 版本,我将拆分答案。

稳定性 <= 0.7.6

请勿删除检查。如果删除,则会打开该函数的整数下溢/溢出漏洞。

示例:

  • _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),它也可以帮助您防止下溢/上溢。示例使用:

// reverts if underflow would happen
_balances[msg.sender] = _balances[msg.sender].sub(amount);

稳定性 >= 0.8.0

取消支票是安全的。 Solidity 0.8+ 默认执行下溢/上溢检查,如果发生下溢/上溢,事务将恢复。