Ethereum 在OpenZeppelin';实施ERC20';s transferFrom,为什么在检查取款人津贴之前调用_transfer()
这是来自OpenZeppelin的ERC20Ethereum 在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[
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的实现遵循这种模式,这很好: