Ethereum 坚固性:合同调用另一个合同和地址不同,为什么?
我有一个包装器契约,它实例化并调用另一个契约,我的测试用例说所有者(msg.sender)不匹配。为什么? 合同AEthereum 坚固性:合同调用另一个合同和地址不同,为什么?,ethereum,contract,solidity,Ethereum,Contract,Solidity,我有一个包装器契约,它实例化并调用另一个契约,我的测试用例说所有者(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, na
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)
编辑
我已将地址公共所有者
添加到合同A
。并在合同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");
}
}
根据你所展示的,我假设你用的是块菌?老实说,我很惊讶这一点 当你打电话时
B = testA.createB("test");
您正在从TestB
调用它msg.sender
将是TestB
的地址
function createB(string name) {
return new B(msg.sender, name); // msg.sender = TestB instance address
}
可能有助于实现您的目标。根据您的演示,我假设您正在使用块菌?老实说,我很惊讶这一点 当你打电话时
B = testA.createB("test");
您正在从TestB
调用它msg.sender
将是TestB
的地址
function createB(string name) {
return new B(msg.sender, name); // msg.sender = TestB instance address
}
可能有助于实现您正在尝试的目标