1. 程式人生 > >Solidity學習::(19)合約之間的呼叫問題【有關介面】

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合約來部署即可,不需要部署介面

接下來的測試步驟同一中所述。

這裡只給出結果