2017-08-26 49 views
1

我有一個實例化和調用另一個合同的包裝合同,而且我的測試用例說所有者(msg.sender)不匹配。爲什麼?Solidity:合同調用另一個合同和地址是不同的,爲什麼?

合同甲

pragma solidity ^0.4.4; 

contract A { 

    address public owner; 

    function A() { 
     owner = msg.sender; 
    } 

    function createB(string name) { 
     return new B(msg.sender, name); 
    } 
} 

合同乙

pragma solidity ^0.4.4; 

contract B { 
    address public owner; 
    string public name; 

    function B(address _owner, string _name) { 
     owner = _owner; 
     name = _name; 
    } 
} 

測試用例

pragma solidity ^0.4.0; 

import "truffle/Assert.sol"; 
import "truffle/DeployedAddresses.sol"; 
import "../contracts/B.sol"; 

contract TestB { 
    B testB; 
    A testA; 

    function beforeEach() { 
     A = A(DeployedAddresses.A()); 
     B = testA.createB("test"); 
    } 

    function testOwnerIsSet() { 
     Assert.equal(address(A), address(B), "Owner's address does not match"); 
    } 
} 

測試結果

1) TestB testOwnerIsSet: 
    Error: Owner's address does not match 
     at /Users/xxx/.config/yarn/global/node_modules/truffle/build/cli.bundled.js:214233:17 
     at Array.forEach (native) 
     at processResult (/Users/xxx/.config/yarn/global/node_modules/truffle/build/cli.bundled.js:214231:19) 
     at process._tickCallback (internal/process/next_tick.js:109:7) 

編輯

我已經加入了address public ownercontract A。並在contract B中公開owner

現在我TESTB合同是這樣的:根據你已經證明什麼,我假設你使用松露

pragma solidity ^0.4.0; 

import "truffle/Assert.sol"; 
import "truffle/DeployedAddresses.sol"; 
import "../contracts/B.sol"; 

contract TestB { 
    B testB; 
    A testA; 

    function beforeEach() { 
     A = A(DeployedAddresses.A()); 
     B = testA.createB("test"); 
    } 

    function testOwnerIsSet() { 
     address aOwner = A.owner(); 
     address bOwner = B.owner(); 
     Assert.equal(aOwner, bOwner, "Owner's address does not match"); 
    } 
} 

回答

0

?說實話,我很驚訝,這編譯。

你打電話時,

B = testA.createB("test"); 

您是從TestB調用它。 msg.sender將是TestB的地址。

function createB(string name) { 
    return new B(msg.sender, name); // msg.sender = TestB instance address 
} 

This可能有助於實現您正在嘗試。

相關問題