合约之间的调用问题
看了一些案例,个人认为合约之间的调用大致可分为两种,一种是编译时同时编译的两个合约,另一种是分开两次编译的合约【需要用到接口】,在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合约来部署即可,不需要部署接口
接下来的测试步骤同一中所述。
这里只给出结果