msg.sender在内部调用中有所不同

问题描述 投票:0回答:1

我是solidityethereum开发的新手。

假设我有以下结构(我的结构比较复杂,但我认为现在可以使用):

contract A {
  address public owner;
  function A() public {
      owner = msg.sender;
  }

  isOwner(address _addr) {
      return _addr == owner;
  }
}

contract Base is A { 
     ....
     someMethod(address _addr) {
        require(isOwner(msg.sender))

        // do something with _addr
     }
}

contract SomeContract{
     Base public baseContract;
     function SomeContract(Base _base) { 
        baseContract = _base
     }
     callingMethod() {
        ....
        require(baseContract.someMethod(msg.sender))
        ....
     }
}

通过从callingMethod调用truffle,它失败了因为require(isOwner(msg.sender))。我能够看到msg.sender与使用Event并将其结果打印到控制台的所有者不同,但我不明白为什么。

谁知道为什么会这样?谢谢 !

solidity truffle
1个回答
2
投票

原因是msg.sender更改为调用合同的地址,即您的案例中的SomeContract。例如,考虑使用Base契约作为library。 msg.sender在这种情况下不会被改变,因为远在DELEGATECALL,但不常见的消息调用将在引擎盖下使用。

© www.soinside.com 2019 - 2024. All rights reserved.