2017-12-20 34 views
0

안녕하세요 저는 solidity & ethereum 신규입니다. msg.sender는 내부 통화가 다릅니다

는의가 (광산이 더 복잡하지만 나는이 지금은 작동합니다 생각) 나는 다음과 같은 구조를 가지고 있다고 가정 해 봅시다 : truffle에서 callingMethod를 호출하여

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

, 그것 때문에 require(isOwner(msg.sender)) 실패합니다. 나는 msg.senderEvent을 사용하는 소유자와 다르다는 것을 알 수 있었고 그 결과를 콘솔에 출력했지만 나는 그 이유를 알지 못합니다.

누구나 이런 일이 발생했는지 알 수 있습니다. 감사 !

+0

[다른 계약을하는 계약에 관한 질문] 가능한 복제본 (https://stackoverflow.com/questions/47858489/questions-about-contract-calling-another-contract) –

답변

0

이유는 msg.sender가 호출 계약 (예 : 귀하의 경우 SomeContract) 주소로 변경되기 때문입니다. 예를 들어 기본 계약을 library으로 사용하는 것을 고려하십시오. 이 경우에는 msg.sender가 변경되지 않고 DELEGATECALL이지만 일반 메시지 호출은 사용되지 않습니다.