Ethereum 在OpenZeppelin';实施ERC20';s transferFrom,为什么在检查取款人津贴之前调用_transfer()

Ethereum 在OpenZeppelin';实施ERC20';s transferFrom,为什么在检查取款人津贴之前调用_transfer(),ethereum,solidity,openzeppelin,Ethereum,Solidity,Openzeppelin,这是来自OpenZeppelin的ERC20transferFrom实现: function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[

这是来自OpenZeppelin的ERC20
transferFrom
实现:

    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;
    }
在检查取款人(
msg.sender
)津贴之前调用
\u transfer
是否有原因


如果先进行津贴
要求
检查,那么从
转移到
是否仍能正常工作?

我在OpenZeppelin上发现了关于同一主题的讨论,代码的作者确认该顺序与ERC-20无关

在ERC20的案例中,订单是不相关的,因为“转让”和“批准”是独立的,从不调用任何其他合同:它们是原子执行的

此外,他还指出,当有人想要覆盖函数时,保持顺序稳定非常重要

然而,这对于那些打算用自己的实现覆盖_transfer或_approve的用户来说非常重要:我们应该清楚这些事情发生的顺序

资料来源:



因此,假设您没有在覆盖的
\u transfer()
\u approve()
内部函数中使用自定义逻辑,则如果您切换订单,
transferFrom()
仍能正常工作。

感谢您的确认。因为它是不相关的,奇怪的是他们没有选择语义上最有意义的排序。然而,ERC1155的实现遵循这种模式,这很好: