Solidity學習::(19)合約之間的呼叫問題【有關介面】
阿新 • • 發佈:2018-12-17
合約之間的呼叫問題
看了一些案例,個人認為合約之間的呼叫大致可分為兩種,一種是編譯時同時編譯的兩個合約,另一種是分開兩次編譯的合約【需要用到介面】,在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合約來部署即可,不需要部署介面
接下來的測試步驟同一中所述。
這裡只給出結果