Солидность: контракт вызывает другой контракт и адреса разные, почему?
У меня есть контракт-оболочка, который создает экземпляр и вызывает другой контракт, и в моих тестовых примерах говорится, что владельцы (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
}
Это может быть полезно для достижения того, что вы пытаетесь.