区块链大学区块链研习社区块链爱好者

DAPP开发杂谈-如何优雅的调用外部合约

2018-10-09  本文已影响5人  9c0ddf06559c

现有有一个LuckyNumber的外部合约,我们可以拿到他的地址,如何在我们自己的合约中优雅的调用这个LuckyNumber呢

  1. 首先查看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];
  }
}
  1. 假如我们要使用getNum方法获取一个人的幸运数字。那么我们就可以先定义一个接口
contract NumberInterface {
  function getNum(address _myAddress) public view returns (uint);
}
  1. 接下来我们只需要在我们的合约中,用我们拿到的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可以自定义构造函数

上一篇 下一篇

猜你喜欢

热点阅读