Солидность: контракт вызывает другой контракт и адреса разные, почему?

У меня есть контракт-оболочка, который создает экземпляр и вызывает другой контракт, и в моих тестовых примерах говорится, что владельцы (msg.sender) не совпадают. Зачем?

контракт А

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 owner в contract A, И сделал owner публика в contract B,

И теперь мой контракт с 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");
    }
}

1 ответ

На основании того, что вы показали, я предполагаю, что вы используете трюфель? И, честно говоря, я удивлен, что это компилируется.

Когда вы звоните,

B = testA.createB("test");

ты звонишь из TestB, msg.sender будет адрес TestB,

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

Это может быть полезно для достижения того, что вы пытаетесь.

Другие вопросы по тегам