从 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
构造函数。有关详细信息,请参阅下面的评论。
我正在处理 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
构造函数。有关详细信息,请参阅下面的评论。