Ethereum ERC20和x27;s如果函数不';你不符合要求吗?

Ethereum ERC20和x27;s如果函数不';你不符合要求吗?,ethereum,solidity,Ethereum,Solidity,我正在学习OpenZeppelin的ERC20合同,并对批准功能感到好奇: function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[send

我正在学习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;
    }
从逻辑上讲,只有当
当前津贴>=金额
时,您才能将<代码>金额从<代码>发送方转移到<代码>接收方

但是,正如您在此函数体中所看到的,调用
\u transfer(发送者、接收者、金额)
后,
要求(当前津贴>=金额)
发生

现在我记得读到以太坊事务是原子的。在这种情况下,是否意味着如果require条件失败,那么
\u传输也不会执行

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

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

因此,没有状态变化(这可能是您所说的“未执行”)但气体已被使用(用于执行)

编辑以澄清:在这种情况下,没有状态更改意味着没有令牌被传输