2017-12-20 32 views
0

私は & 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となりますが、通常のメッセージコールはそのフードの下では使用されません。

関連する問題