【CryptZombies】レッスン2チャプター10:ゾンビは何を食べるのか?interface(別のコントラクトとのやりとり)
別のコントラクトとのやりとり
ブロックチェーン上の他人のコントラクトとやりとりするには、最初にinterfaceを定義します。
例として、以下のコントラクトがブロックチェーン上にあったとします。
contract LuckyNumber {
mapping(address => uint) numbers;
function setNum(uint _num) public {
numbers[msg.sender] = _num;
}
function getNum(address _myAddress) public view returns (uint) {
return numbers[_myAddress];
}
}
この簡単なコントラクトでは、だれでも自分のラッキーナンバーを格納してそれをイーサリアムアドレスと関連づけることができます。
そのアドレスを使えば、だれでもその人のラッキーナンバーを探し出すことが可能です。
Interfaceの定義
ここで、仮に私たちが外部コントラクトを持っていたとして、getNum関数でコントラクトのデータを読みたいとします。
その場合、まずはLuckyNumberコントラクトのinterfaceを定義します。
contract NumberInterface {
function getNum(address _myAddress) public view returns (uint);
}
コントラクト自体を定義しているようにも見えますが、違います。
ここでは、やりとりしたい関数(getNum)のみを宣言していて、他の関数とか状態変数には触れていません。
また、関数自体を定義していません。括弧({})ではなく、関数の宣言の終わりにセミコロン(;)を使っています。
見た目はコントラクトの骨格みたいなものです。
コンパイラはこれを見てinterfaceだと理解するのです。
このinterfaceをdappのコードに組み込むことで、私たちのコントラクトから、他人のコントラクトの関数がどのようなもので、どのように呼び出すか、どんな応答がでるかを知ることができます。
テストの実行
①KittyInterfaceというinterfaceを定義せよ。これは新しいコントラクトを作るのと同じようなものだ。contractキーワードを使用せよ。
contractでKittyInterfaceを宣言します。
②interface内に、getKitty関数を定義せよ。(※1下記の関数)をコピペするものを作成せよ。ただし、括弧の中に書くのではなく、returnsステートメントの後にセミコロンをつけよ。)
①で作成したinterface内に、getKitty関数を定義します。
interface内では、やりとりしたい関数(getKitty)のみを宣言して、他の関数や状態変数には触れません。
また、関数の宣言の終わりにセミコロンを使います。
※1
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
) {
Kitty storage kit = kitties[_id];
// if this variable is 0 then it's not gestating
isGestating = (kit.siringWithId != 0);
isReady = (kit.cooldownEndBlock <= block.number);
cooldownIndex = uint256(kit.cooldownIndex);
nextActionAt = uint256(kit.cooldownEndBlock);
siringWithId = uint256(kit.siringWithId);
birthTime = uint256(kit.birthTime);
matronId = uint256(kit.matronId);
sireId = uint256(kit.sireId);
generation = uint256(kit.generation);
genes = kit.genes;
}
お疲れさまでした!
<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network