从稳固性调用在特定地址部署的合同的函数

时间:2018-04-21 20:10:28

标签: ethereum solidity

我正在处理来自稳固性的继承和外部合同调用。我已经部署了我的数据结构并将其填入地址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合同,插入不同的数据,然后在部署数据合同时引用一个特定的合同。

1 个答案:

答案 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构造函数。有关详细信息,请参阅下面的评论。