在OpenZeppelin ERC20实现中,有一个_transfer方法:
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
Run Code Online (Sandbox Code Playgroud)
为什么他们使用未经检查的算术来减少余额?我知道,如果未经检查,2-3 将返回 2**256-1 并且不会出现异常。但为什么我们需要这个?