Interfaces

介面初始化

  • January 31, 2018

我正在關注cryptozombies solidity教程。在第 2 課第 11 章中,它解釋瞭如何為CryptoKitties創建一個介面,如下所示:

contract KittyInterface {
 function getKitty(uint256 _id) external view returns (
   bool isGestating,
   bool isReady,
   uint256 cooldownIndex,
   uint256 nextActionAt,
   uint256 siringWithId,
   uint256 birthTime,
   uint256 matronId,
   uint256 sireId,
   uint256 generation,
   uint256 genes
 );
}

然後它在契約中對其進行初始化:

contract ZombieFeeding is ZombieFactory {

 address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
 KittyInterface kittyContract = KittyInterface(ckAddress); // this initialization is what I don't get

 function feedAndMultiply(uint _zombieId, uint _targetDna) public {
   require(msg.sender == zombieToOwner[_zombieId]);
   Zombie storage myZombie = zombies[_zombieId];
   _targetDna = _targetDna % dnaModulus;
   uint newDna = (myZombie.dna + _targetDna) / 2;
   _createZombie("NoName", newDna);
 }    
}

我不明白如何使用沒有定義建構子來初始化介面KittyInterface

我看到通常關鍵字interface用於定義介面(而不是contract),我在想也許編譯器知道可以使用地址初始化介面,但這裡不是這種情況。

如果有人能解釋這是如何工作的,那就太好了。

address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
KittyInterface kittyContract = KittyInterface(ckAddress); // this initialization is what I don't get

那條線沒有做任何形式的“初始化”。它只是投射地址。這意味著它kittyContract現在是一個類型的合約KittyInterface,並且當你呼叫該合約上的函式時,它們應該被發送到地址ckAddress

介面向編譯器解釋了可以在外部合約上呼叫哪些函式,而無需導入該合約的完整原始碼。

在這種情況下,kittyContract 已經完全獨立部署到這個殭屍合約中。所以在乙太坊區塊鏈上存在這個 kittyContract,現在這個新的、不相關的合約希望能夠呼叫那個 kittyContract 的函式。為此,ZombieFeeding 需要知道外部合約中有哪些功能可用,以確保傳遞正確的數據等。

定義介面時,您不必在外部合約中定義所有函式或公共變數,您只需定義將在合約中與之互動的那些。

引用自:https://ethereum.stackexchange.com/questions/38070