Solidity学习::(19)合约之间的调用问题【有关接口】

合约之间的调用问题


看了一些案例,个人认为合约之间的调用大致可分为两种,一种是编译时同时编译的两个合约,另一种是分开两次编译的合约【需要用到接口】,在remix的体现如下

一、编译时,同时编译的两个合约之间的调用

pragma solidity ^0.4.0;
 
contract AccessGetter{
  uint public data = 10;

  function f() returns (uint, uint){
    data++;
    return (data, this.data());
  }
}
 
contract SetVar{
  function AddData(AccessGetter accessget){//调用同时编译的外部合约
      accessget.f();
  }
}

编译成功,部署后如下:

 调用SetVar合约的AddData方法后,

成功调用


问题:

如果两个合约是分开编译的,则SetVar这个合约会编译失败,这时候要用到接口


接口声明举例

interface 

contract NumberInterface {
  function getNum(address _myAddress) public returns (uint);
}

请注意,这个过程虽然看起来像在定义一个合约,但其实内里不同:

首先,我们只声明了要与之交互的函数 —— 在本例中为 getNum —— 在其中我们没有使用到任何其他的函数或状态变量。

其次,我们并没有使用大括号({ 和 })定义函数体,我们单单用分号(;)结束了函数声明。这使它看起来像一个合约框架。

编译器就是靠这些特征认出它是一个接口的。


二、分开编译的合约之间的调用

先编译部署第一个合约:

pragma solidity ^0.4.0;
 
contract AccessGetter{
  uint public data = 10;

  function f() returns (uint, uint){
    data++;
    return (data, this.data());
  }
}

观察到第一个合约的函数,接下来在第二个合约前面定义好接口【有点像函数的虚构和重载的感觉】

pragma solidity ^0.4.0;
 
contract AccessGetter{
    function f() public returns(uint,uint);
}
contract SetVar{
  function AddData(AccessGetter accessget){//调用同时编译的外部合约
      accessget.f();
  }
}

这时候编译就不会报错了,部署的时候,我们直接选SetVar合约来部署即可,不需要部署接口

接下来的测试步骤同一中所述。

这里只给出结果

猜你喜欢

转载自blog.csdn.net/dieju8330/article/details/83303769