我正在处理来自稳固性的继承和外部合同调用。我已经部署了我的数据结构并将其填入地址MapAdr
我的代码可以按照以下方式设计。在我的DataStructure.sol中,我有:
interface Graph {
function getNeighbours(uint8 id) external view returns (uint8[8]);
function getOrder() external view returns (uint8);
function isNeighbour(uint8 strFrom, uint8 strTo) external view returns
(bool success);
}
contract DataStructure is Graph {
....code....
uint8 order;
constructor (uint8 size) {
order = size;
}
....code...
}
我部署了这份合同,并将地址保存到MapAdr = 0x1234567 ......
现在我转到我的另一份合同
pragma solidity ^0.4.22;
import "./DataStructure.sol";
contract Data is Graph {
.....code....
DataStructure public data;
constructor(address MapAdr) public {
....code...
data = DataStructure(MapAdr);
....code...
}
.....code....
}
但是部署了DataStructure,但它的地址不是MapAdr。
有一种方法可以在特定的MadAdr上创建已部署合同的实例(因此,确切的数据插入到该数据结构中),这样我就可以查询它的存储空间了吗?
我们的想法是部署多个DataStructure合同,插入不同的数据,然后在部署数据合同时引用一个特定的合同。
答案 0 :(得分:1)
我不确定这是否完全回答了你的问题,但我发现这个例子与你所说的非常相似,我希望它可以帮助你。
contract Admin {
address private owner;
function Admin() public { owner = msg.sender; }
function getOwner() public returns (address) {
return owner;
}
function transfer(address to) public {
require(msg.sender == owner);
owner = to;
}
}
contract Lottery {
string public result;
Admin public admin = Admin(0x35d803f11e900fb6300946b525f0d08d1ffd4bed); // Admin contract was deployed under this address
function setResult(string _result) public {
require(msg.sender == admin.getOwner());
result = _result;
}
}
如您所见,Admin
合同部署在地址0x35d...
下,然后在Lottery
变量定义的admin
合同中使用了该合同。一旦将变量声明为另一个合同的实例,就可以使用该合同的所有公共接口。检查admin.getOwner();
执行。
同样,它没有按照您提到的相同示例,但它可能有用。
希望它有所帮助! ; - )
编辑1:在Admin
中对Lottery
实例的地址进行硬编码可能是一个坏主意。这只是一个非常简单的例子。您可以考虑将Admin
实例地址作为参数传递给Lottery
构造函数。有关详细信息,请参阅下面的评论。