初心者文系主婦がブロックチェーンを学ぶブログ

IT革命のビッグウェーブに乗り遅れた主婦が、ブロックチェーン革命の波にのるべく、ブロックチェーン技術を学ぶブログです。

【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を宣言します。

f:id:nomadomama:20181202001222p:plain


②interface内に、getKitty関数を定義せよ。(※1下記の関数)をコピペするものを作成せよ。ただし、括弧の中に書くのではなく、returnsステートメントの後にセミコロンをつけよ。)

①で作成したinterface内に、getKitty関数を定義します。

interface内では、やりとりしたい関数(getKitty)のみを宣言して、他の関数や状態変数には触れません。

また、関数の宣言の終わりにセミコロンを使います。

f:id:nomadomama:20181202001557p:plain

 

※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