【问题标题】:Solidity: contract calling another contract and addresses are different, why?Solidity:合约调用另一个合约,地址不同,为什么?
【发布时间】:2018-02-04 12:18:06
【问题描述】:

我有一个包装合同实例化并调用另一个合同,我的测试用例显示所有者 (msg.sender) 不匹配。为什么?

合同A

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

合约B

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 owner 添加到contract 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");
    }
}

【问题讨论】:

    标签: ethereum contract solidity


    【解决方案1】:

    根据您所展示的内容,我假设您使用的是松露?老实说,我很惊讶它能编译。

    当你打电话时,

    B = testA.createB("test");
    

    您从TestB 调用它。 msg.sender 将是TestB 的地址。

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

    This 可能有助于实现您的目标。

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 1970-01-01
      • 2021-09-11
      • 2019-06-16
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      相关资源
      最近更新 更多