【问题标题】:Figuring out addresses in an ERC20 contract找出 ERC20 合约中的地址
【发布时间】:2021-11-24 20:42:09
【问题描述】:

我正在编写一个 ERC20 合约,它允许另一个 ERC20 能够使用我的合约,但我不确定如何在下面给出的场景中获取特定地址。

假设我的合同是CoinA,而别人的合同是PartnerCoin。我被代理了,他们可能会也可能不会(在这种情况下,我已经知道他们是否被代理了)。假设我使用 OpenZeppelin 作为我的代理。我代币的代理合约地址是 0x123,他们的代币合约(或代理)地址是 0x456。可以说,如果PartnerCoin被代理了,那么它们的实现地址就是0x192。

某人 Bob 出现并想将他的 10 个PartnerCoin 转移给他的朋友 John。 Bob 的钱包地址是 0x987,John 的钱包地址是 0x654。 PartnerCoin 对其传输函数有一个要求,它必须从可以从 CoinA 调用的公共函数中接收特定响应,否则它不会传输。它调用函数,我们将其称为SuperFunction,在CoinA 上并等待响应。

我只希望PartnerCoin 能够呼叫SuperFunction,至少现在是这样,而且我知道PartnerCoin 的地址是什么。

在我的实施合同中,比如 0x384,我认为是这样的:

msg.sender 将返回 0x123,我自己的代理,因为我的代理正在调用我的实现,对吗?

_msgSender() 将返回 0x987,因为他们是实际的最终用户。

什么会返回 0x456,PartnerCoin 的合约地址,以便 CoinA 可以检查确实是 PartnerCoin 在调用 SuperFunction,而不是其他硬币?

感谢您的帮助!

【问题讨论】:

    标签: ethereum smartcontracts cryptocurrency erc20 openzeppelin


    【解决方案1】:

    OpenZeppelin _msgSender() (source) 当前 (OZ 4.x, Solc 0.8.x) 返回与全局变量 msg.sender 相同的值。如果 msg.sender 被弃用(正如其前身 tx.origin 已经发生的那样),该函数的存在是为了更容易升级。

    PartnerCoin 调用您的SuperFunction 时,他们是直接调用您的合约还是通过代理(即delegatecalls 您的合约)调用您的合约并没有什么区别。 msg.sender 永远是 PartnerCoin

    如果代理仅called(而不是delegatecalled)您的合同,那么是的,msg.sender 将是代理。但 OpenZeppelin 代理合约 (source) 并非如此。

    【讨论】:

    • 所以在我的例子中,msg.sender 和 _msgSender() 都会返回 0x456,然后呢?或者他们都会返回 0x987?感谢您的帮助!
    • @RatherPeachy 两者都将返回 PartnerCoin 实现(不是代理)地址。很遗憾,我在您的问题中没有看到这个地址。
    • @RatherPeachy 如果 Bob called PartnerCoinPartnerCoin,则 0x987(Bob 的地址)在您的合约中将是 PartnerCoindelegatecalled 你的合同。但随后PartnerCoin 将充当代理,因此您的合约将无法访问您的合约存储(它将使用代理的存储,在本例中为PartnerCoin)。
    • 这很有意义!如果我们需要再次引用PartnerCoin 实现地址,我们称之为0x192 - 我将使用该信息编辑原始问题。听起来,如果 Bob (0x987) called PartnerCoin,但 PartnerCoin 然后调用 SuperFunction,那么 SuperFunction 拥有两个地址 0x192 和 0x987 的唯一方法是 @ 987654349@ 将 0x987 作为参数传递。那么,对于SuperFunction_msgSender()(和msg.sender)将是 0x192,而这个新参数可能是 0x987。对吗?
    • @RatherPeachy 没错。
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 2018-01-03
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多