【问题标题】:What is the purpose of declaring an extra local variable in this OpenZeppelin ERC20 implementation?在这个 OpenZeppelin ERC20 实现中声明一个额外的局部变量的目的是什么?
【发布时间】:2021-04-02 12:13:35
【问题描述】:

从Openzeppelin使用solidity ^0.8.0实现ERC20来看,_transfer函数是这样的:

function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

写作有什么特殊目的

uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;

而不是简单

require(_balances[sender]>= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] -= amount;

?

【问题讨论】:

    标签: ethereum solidity


    【解决方案1】:

    从包含this commitpull request 评论添加senderBalance

    将恢复消息添加回 0.8 分支 (#2491) 会产生对某些存储槽的双重读取。此 PR 消除了双重 sload,从而降低了运行受影响函数的 gas 成本。

    所以这是因为降低了gas使用量。

    “从存储读取一次,从内存读取一次”比“从存储读取两次”花费的 gas 少得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2021-06-03
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多