首页 > 解决方案 > ERC20的transferFrom函数不满足require语句会失败吗?

问题描述

我正在学习 OpenZeppelin 的 ERC20 合约并对批准功能感到好奇:

function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

amount从逻辑上讲,sender只有recipient currentAllowance >= amount.

但是,正如您在此函数体中看到的那样require(currentAllowance >= amount)调用_transfer(sender, recipient, amount).

现在我记得读到以太坊交易是原子的。在这种情况下,是否意味着如果 require 条件失败,那么_transfer也不执行?

标签: ethereumsolidity

解决方案


是否意味着如果require条件失败,那么_transfer也不会执行

从技术上讲,它会被执行,但随后由于失败条件产生的无效操作码而恢复。require

所以没有状态变化(这可能是“未执行”的意思),但气体已被使用(用于执行)。

编辑澄清:在这种情况下没有状态变化意味着没有令牌被转移


推荐阅读