是否可以使用其存储但通过msg.sender来牢固地调用合同?

问题描述

我有以下两个合同:


contract A {
  uint256 someData = 3

  function foo() public view returns (uint256) {
    // return something based on msg.sender and someData
  }
}

contract B {
  A public a;

  function bar() public {
    // I'd like to call a.foo with msg.sender for this context
    uint256 ret = a.foo()  
  }
}

如前所述,我想在a.foo的上下文中用B调用msg.sender内的B,但我想在A的someData中使用存储。这意味着使用delegatecall无效,因为它将使用B的存储进行A.foo调用

有什么办法可以在这里做我想要的吗?问题与“真实的” A已经部署在主网上并且我无法更改其编写方式有关。

解决方法

到目前为止,我认为这是不可能的。我只是遇到了同样的问题,但找不到任何解决方案。如果您可以从头开始创建新合同,然后通过将所有令牌转移到新地址来再次将其部署在主网上,将会更好。