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合约来部署即可,不需要部署接口

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

这里只给出结果

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值