2017-08-26 44 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可能有助于实现您正在尝试。

相关问题