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))
        ....
     }
}

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

任何人都知道为什么会这样?谢谢 !

4

1 回答 1

2

原因是 msg.sender 更改为调用合同的地址,即 SomeContract 在您的情况下。例如,考虑将 Base contract 用作​​ library。在这种情况下,msg.sender 不会更改,因为 DELEGATECALL 但不会在后台使用常规消息调用。

于 2017-12-21T21:23:50.197 回答