ethereum - 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
也不执行?
解决方案
是否意味着如果require条件失败,那么_transfer也不会执行
从技术上讲,它会被执行,但随后由于失败条件产生的无效操作码而恢复。require
所以没有状态变化(这可能是“未执行”的意思),但气体已被使用(用于执行)。
编辑澄清:在这种情况下没有状态变化意味着没有令牌被转移。
推荐阅读
- errbot - 什么配置选项允许机器人响应自己发布的命令?
- java - 如果枚举映射键为空或未知,则忽略 JSON 反序列化
- c++ - 为什么/何时应该使用 std::unique/shared_ptr (std::vector<>) 而不是 std::vector<>?
- angular - 我可以在 Angular4 中对两种不同的数据类型使用 OR (||) 运算符吗?
- haskell - 任何人都知道如何使用 Text.Regex 作为单词边界?
- javascript - 以 JSON 格式显示的内容默认语言环境
- git - 使用 git 交互式 rebase 仅在一组提交中更改作者姓名的风险?
- javascript - 从 SVG 中的路径获取 id
- mysql - 为什么这个sql查询需要很长时间?
- ios - 在 Swift 中请求时具有未知内容的本地通知