【问题标题】:msg.sender is different in internal callmsg.sender 内部调用不同
【发布时间】:2017-12-20 17:36:39
【问题描述】:

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

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

有人知道为什么会这样吗?谢谢!

【问题讨论】:

标签: solidity truffle


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2022-06-13
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    相关资源
    最近更新 更多