DAPP开发杂谈-如何优雅的调用外部合约
2018-10-09 本文已影响5人
9c0ddf06559c
现有有一个LuckyNumber的外部合约,我们可以拿到他的地址,如何在我们自己的合约中优雅的调用这个LuckyNumber呢
- 首先查看LuckyNumber的源代码,明确我们要使用哪个方法
pragma solidity ^0.4.20;
contract LuckyNumber {
uint internal data;
mapping(address => uint) numbers;
constructor(uint a) public {
data = a;
}
function setNum(uint _num) public {
numbers[msg.sender] = _num;
}
function getNum(address _myAddress) public view returns (uint) {
return numbers[_myAddress];
}
}
- 假如我们要使用
getNum方法获取一个人的幸运数字。那么我们就可以先定义一个接口
contract NumberInterface {
function getNum(address _myAddress) public view returns (uint);
}
- 接下来我们只需要在我们的合约中,用我们拿到的LuckyNumber的合约地址实例化NumberInterface,然后就可以调用NumberInterface方法了
contract MyContract {
address NumberInterfaceAddress = 0x692a70d2e424a56d2c6c27aa97d1a86395877b3a;
// ^ 这是FavoriteNumber合约在以太坊上的地址
NumberInterface numberContract = NumberInterface(NumberInterfaceAddress);
// 现在变量 `numberContract` 指向另一个合约对象
function someFunction() public view returns(uint){
// 现在我们可以调用在那个合约中声明的 `getNum`函数:
uint num = numberContract.getNum(msg.sender);
return num;
// ...在这儿使用 `num`变量做些什么
}
}
注意这里有几个点
1.NumberInterface不需要有LuckyNumber的所有方法
2.LuckyNumber和NumberInterface不是继承关系,只需要保证NumberInterface要使用的方法和LuckyNumber中的方法定义一样即可
3.LuckyNumber和NumberInterface的构造函数没有联系,NumberInterface默认构造函数传入参数为合约地址,并且不可更改,LuckyNumber可以自定义构造函数