title | actions | material | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ゾンビは何を食べるのか? |
|
|
さて、いよいよゾンビに餌をやるぞ!なに?ゾンビはいつも何を食べるのかだと?
CryptoZombiesの大好物はな...
クリプトキティーズ(暗号子猫)だ! 😱😱😱
(マジだぜ 😆 )
クリプトキティスマートコントラクトから、kittyDnaを読み込むんだよ。クリプトキティーズのデータはブロックチェーン上に公開されているからな。なに、ブロックチェーンはやばい?
心配はいらんぞ。このゲームで誰かのクリプトキティを傷つけるつもりはない。ただクリプトキティーズのデータを読み込むだけだ。そのデータは消せないものだから、なんの問題もない。 😉
ブロックチェーン上の他人のコントラクトとやりとりするには、最初に**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];
}
}
この簡単なコントラクトでは、だれでも自分のラッキーナンバーを格納してそれをイーサリアムアドレスと関連づけることができるものだ。そのアドレスを使えば、だれでもその人間のラッキーナンバーを探し出すことが可能だ。
では、ここで仮に我々が外部コントラクトを持っていたとして、getNum
関数でコントラクトのデータを読みたいとする。
その場合、まずはLuckyNumber
コントラクトの**interface**を定義するのだ。
contract NumberInterface {
function getNum(address _myAddress) public view returns (uint);
}
コントラクト自体を定義しているようにも見えるが、少し違うぞ。ここではやりとりしたい関数(ここではgetNum
)のみを宣言していて、他の関数とか状態変数には触れていないのだ。
次に、関数自体を定義していないことがわかるかな。括弧({
や }
)ではなく、関数宣言の終わりにセミコロン (;
)を使っているだろう。
見た目はコントラクトの骨格みたいなものだ。コンパイラはこれを見てinterfaceだと理解するのだ。
このinterfaceをdappのコードに組み込むことで、我々のコントラクトから、他人のコントラクトの関数がどのようなもので、どのように呼び出すか、どんな応答が返るかを知ることができるのだ。
次のレッスンでは実際に他のコントラクトを使った演習を行うが、ここではクリプトキティーズコントラクトのためのinterfaceを宣言するだけにしておくぞ。
君のためにクリプトキティーズのソースコードを見つけておいてやったぞ。ここにはgetKitty
という関数があり、"genes"(新しいゾンビを作り出すために我々が必要としているのはこれだ)を含む全てのキティのデータを返すようになっている。
関数はこのようになっている:
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;
}
この関数はこれまで学んできたものと少し違うように見えるだろう。returnの部分を見てみるのだ...たくさん色々な値があるだろう。JavaScriptのような言語を知っているなら、その違いははっきりわかるはずだ。Solidityは関数から複数の値を返すことが可能なのだ。
これでこの関数がどういうものかわかった。そこでこれを使ってinterfaceを作るぞ。
-
KittyInterface
というinterfaceを定義せよ。これは新しいコントラクトを作るのと同じようなものだ。contract
キーワードを使用せよ。 -
interface内に、
getKitty
関数を定義せよ。(上記の関数をコピーペーストするものを作成せよ。ただし、括弧の中に書くのではなく、returns
ステートメントの後にセミコロンをつけよ。)