MSG.Sender在内部呼叫中有所不同



我是solidity&ethereum开发。

假设我有以下结构(我的一个更复杂的结构,但我认为这将起作用):

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的所有者不同并将其结果打印为控制台,但我不明白为什么。

有人知道为什么会发生这种情况?谢谢!

原因是msg.sender更改为呼叫合同的地址,即在您的情况下进行的。例如,考虑使用基本合同作为库。在这种情况下,MSG.SENDER不会更改为delegatecall,但不会在引擎盖下使用常规消息。

msg.sender可能代表用户地址或其他合同地址。

通常是一个用户地址,但是当您的合同内拨打合同时,另一个合同msg.sender将是合同呼叫者的地址 - 不是在初始电话中定义的地址,例如contract.connect(<signer>)

ERC721代币批准的情况下可能很重要:我们可以批准一个地址,但最终授权的ERC721代币函数将由部署的合同调用,最终将被尊敬的TX授予。

最新更新