Interfaces
介面初始化
我正在關注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 需要知道外部合約中有哪些功能可用,以確保傳遞正確的數據等。
定義介面時,您不必在外部合約中定義所有函式或公共變數,您只需定義將在合約中與之互動的那些。