Context.sol 在 Openzepplin 中的用途是什么

Vov*_*ova 3 solidity ether

我是 Solidity 新手,并尝试使用 openzepplin 部署 ERC20 令牌。有一件事对我来说没有意义,那就是 context.sol 文件。从评论部分来看,context.sol 的主要功能似乎是实现 GSN 兼容合约,因此您不使用 msg.sender,而是使用 _msgSender()

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
Run Code Online (Sandbox Code Playgroud)

从我有限的 Solidity 经验来看,它似乎对 msg.sender 做了完全相同的事情。

Pet*_*jda 9

在这种情况下,这是同样的事情。

我相信 OpenZeppelin 开发人员实现此功能是为了使其在需要时更容易互换。因此,如果由于某种原因msg.sender变得过时,只需更改一行而不是多个合同中的多行(并且可能会忘记一些)。

类似的情况以前也发生过,当时tx.origin一些区块链开发人员更喜欢它,但后来它被(由 Solidity lang 核心团队)弃用,转而支持msg.sender.