繁体   English   中英

在这个 OpenZeppelin ERC20 实现中声明一个额外的局部变量的目的是什么?

[英]What is the purpose of declaring an extra local variable in this OpenZeppelin ERC20 implementation?

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

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;

?

从包含此提交拉取请求评论中添加senderBalance

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM