Solidity言語

噛み付いちゃうぞCryptoZombies⑥

いまね、Twitterで色々と情報得るべく、フォローする人たちを探してはポチッと押していく作業をしていました。個人的にはエンジニアさんの情報が欲しいので、プロフの所にエンジニアだったり、フリーランスっていう言葉がついている方をフォローしてて、後は歳が近いとか、聞いたことある名前だなとか、、そんな基準でフォローしていましたので、フォローされた方は毛嫌いせずに、どんな親父なんだ?という目で見てくださいw

ではでは、やっていきますよ!!

CryptoZombies | イーサリアムでのゲーム開発を学ぶ

チャプター9:別の関数とビジビリティ

でた〜、意味不明言語〜!!w

ビジビリティってなんじゃい??(visibility)

意味としては、目に見える度合い、視界、見通し、可視性、視認性との事。

意味はまぁよしとして、以下読んで行きましょう。
23

前回のブログで書いた時は、別段エラーでなかったんだけどなぁ、、、、
どういうエラーが出てたんだろう、、、見直してもわからん、、、

要約すると、private関数なのにデータ引っ張ってきた事になるから、データは引っ張ってこれないよってエラーがでる、という事ですね。

要約になったかな、、w
34

publicとprivateの他に、internalexternalなるものがあると、、、4種類あるっていう事なのか。

今回のエラーの原因としてprivateだとアクセスできないが、別の関数だとそれが可能になるとのことで、答えとしてはinternalを使うとできるようになるってことですね。

internal = このコントラクトから継承したコントラクトにもアクセスできるようになる
private =  このコントラクトから継承したコントラクトにはアクセスできない。

という事になるんですね。

ふむふむっ、、なるへそ。。

詳しい説明は以前にも登場いただいた高妻さんのブログに掲載しております!
[Solidity基礎知識] public,privateとexternalとinternalの違いと使い所

externalに関しては、コントラクト外からしかアクセスできない、という事になりますね。
ってことは、外部から利用するための関数にexternalを使用するという事になりますよね。。

まだ先が見えていないのでどう使い分けるかは、高妻さんのブログにも書いてますが、パニックになりかねないので、今はスルーしますw

宣言方法は以下のようになりますね。とっても簡単ですな!
43
宣言した関数名の後につける、と覚えればいいんじゃないでしょうか!

それではテストだ!!
48

これはもう簡単の単、ですね!

ただ変更するだけですからね!

function _createZombie(string _name, uint _dna) internal {
}

と変更すればOKです!
では次っ!!

チャプター10:ゾンビは何を食べるのか?

やべぇ〜ここ解説するとなるとめっちゃなげぇ〜w
要約してそんなに長くならないようにします!
47
そして衝撃的な事実が発覚ww
ゾンビの好物はクリプトキティズwww

まぁ食べるといってもデータだけだから、実際の猫がゾンビになるわけではないのでご安心をw
57
13

ここでは別のコントラクトとやりとりしなくてはいけないので、どうすればやりとりが可能になるかの説明が書いてありますね。

ちなみに、、、先ほどexternalの話をしましたが、クリプトゾンビーズからクリプトキティズにアクセスする場合、その関数がexternalじゃないと外部からのアクセスができないという話をしましたよね。

そうなんです、、このチャプターのテストの中に出て来ますが、getKitty関数はexternalで宣言しているのです。

後で出てくるので、その時また言いますね!

まずは外部コントラクトからアクセスしたい場合interface関数を定義するとのこと。

ただ、この例から言うと、、、luckyNumberコントラクトのinterfaceを定義するのだ。といっているんだが、、

contract NumberInterface {}

となっている。。。ん??luckyどこいった??w
省略していいというようなものなのかしら??

調べてみたがそのような記述は載ってないし、、、
実戦で使って確かめるしかなさそうか、、、

27
残念ながら先ほどの添付画像だと尻切れとんぼになってしまっているので、わからないのですが、、

contract NumberInterface {
function getNum(address _myAddress) public view re
turns(uint);
}

となっていたんですね。

interfaceを定義して、functionから始まっているが、関数を定義する場合だとお尻が{}となるのだが、ここは関数の定義ではないため、セミコロン(;)になっています。

これを見てコンパイラがinterfaceだと判断するとのことです。

へぇ〜なるへそ!!

という事で、テストだ!!

44
58
12

ひぃ〜、、貼り付けたはいいが長い、、、w

getKitty関数のreturns(の後は改行して、パラメータをわかりやすく改行しているだけなので、少し多いってだけで今までと同じ事をしているから、長いってだけで勘違いしちゃダメよ!(自分に言い聞かせw)

ここで宣言されているgetKitty関数はexternalで宣言しているので、外部からのアクセスができる状態である事を意味してますね。view修飾子もついているので、見るのはOKだけど、書き換えはできないよって、事で理解しておくといいかな。

まぁ書き換えできてしまったら、とんでもないことになりますからね、、w

では問題に行きましょうか!

1ではKittyInterfaceというinterfaceを定義せよ!といっているので、、定義する際はcontractを使うので、、、

contract KittyInterface {
}

となりますな。

2では、getKitty関数を定義せよ!なので、例を見て考えると、、、めちゃくちゃ長くなりますが、

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
);

となります。、、function getKittyからreturnsの「)」までコピペしてセミコロン「;」ですなw

合体させると、、

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
);
}

となります!!
ふぅ〜、CryptoZombie史上一番長いコードを書いたんじゃないでしょうかw

間違っていたら悪いので、テストだ!の後にあるgetKitty関数をコピーして使ってくださいねw

これで使うまでの自然準備は完了した、という事になりますね!!

次のチャプターでは使えるように設定する方法をやりますよ!

という事で今日のところはここまで!!

次回は午後は15時頃から更新します!!
その間はレッスン1から英語バージョンで挑戦してみつつ、振り返ろうと思います。

CryptoZombies | イーサリアムでのゲーム開発を学ぶ

それではまた後ほど!!

ABOUT ME
shidayuu
元バンドマンで読書・書評をしている函館在住32歳、しだゆうと申します! このブログでは主に読書した内容を元に、「ヒラメキを発信する」をテーマとして毎日更新しています。 書評をメインに、たまに元バンドマンの知識を発信していきます! あなたの役に立てる記事を書いていきます!