从 solidity 调用部署在特定地址的合约函数

Call functions of a contract deployed at a specific address from solidity

我正在处理 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 合同,然后在部署数据合同时引用一个特定的合同。

我不确定这是否能准确回答你的问题,但我发现这个例子与你所说的非常相似,希望它能对你有所帮助。

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... 下,然后在 admin 变量定义中的 Lottery 合约中使用。一旦将变量声明为另一个合约的实例,就可以使用该合约的所有 public 接口。检查 admin.getOwner(); 执行。

同样,它并没有遵循您提到的相同示例,但它可能会有用。

希望对您有所帮助! ;-)

编辑 1:在 Lottery 中对 Admin 实例的地址进行硬编码可能不是一个好主意。这只是一个非常简单的例子。您可能会考虑将 Admin 实例地址作为参数传递给 Lottery 构造函数。有关详细信息,请参阅下面的评论。