Solidity言語

噛み付いちゃうぞCryptoZombies②

ではでは午後の部、進めてまいります!

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

チャプター3:Msg.sender

あ〜、今朝同様、、、あんまししっかりと理解できてないやーつですな。。
46

msg.senderって何?っていうのが正直な気持ちですが、全ての関数で利用できるグローバル変数っていうのがこの「msg.sender」という事だという説明ですよね。

全ての関数で利用できるってことは、Solidity言語の中では共通語という認識でいいじゃないでしょうか。

だからどこからでも呼び出せるという認識にしておきましょう。

このmsg.senderを使うと、それを呼び出したユーザーのaddressを参照できる、とのこと。

ふむふむ、、、まぁ次に行きましょか。。

30
こちらが使用例と、、、

mappingは今朝のブログ記事を参照いただければわかりやすいと思います。
下手くそながらリンク↑↑貼りましたよ!

//の説明が長くて見切れてしまっていますが、例としてはこのように使いますよ、という流れを見てもらえるといいと思いますな。

プログラムの3行目の、

favoriteNumber[msg.sender] = _myNumber;

っていうのが、マッピングにデータを格納する方法ということらしい、、

??そうなのね、、、としか言えませんww

、、、この説明ではなんとも言えないので、次にすすみます。

03

さっきの例は理解やすいように簡単にしてあるってさ、、、ヤベェw

大事なことはmsg.senderを利用することによってセキュリティが強化されるから、使わないとダメよ!ということですかね。

呼び出したユーザーのaddressを参照できるってことなので、一人一つのアドレスしか持てないのでセキュリティ上も安心して使えますよって事なんじゃなかろうか。。

2割くらいしか理解できなかったが、テストだ!!orz…

09

まずは_createZombieメソッドを更新して、と書いてあるので、そこまでカーソルを持っていく。そうすると//ここから始めるのだ、と入れる場所を教えてくれる。

1では、マッピングを更新せよ。と言っているので、マッピングの更新は前の方で書いてあるので、まずはそれを参照してみよう。

例:
favoriteNumber[msg.sender] = _myNumber;

これが、マッピングを更新する際に使われたサンプルです↑↑

こちらの名前を変更して入れてみると、、

zombieToOwner[msg.sender] = 

となるのだが、ここで文章を確認してみよう。

「まず最初は、新しいゾンビのidを取得して、id下にmsg.senderを格納して」と言っています。

ってことは、id = msg.sender;っていう形になりますかね??

「id下に」という言葉がひっかかってしまうのですが、自分が頭悪いからかもしれませんので、スムーズに進んでいる方であれば、そこは問題なく解決するのかな?

私なんかは、zombieToOwner[msg.sender] = id;なんていう考えで進めてみて、見事に違うよと指摘を受けましたw

答えとしては、、

zombieToOwner[id] = msg.sender;

となります。

2では、このmsg.senderでownerZombieCountを増やせ。と言っていて、その下には増やし方の例が書いてあるので、そのまま名前を変えて入力してみます。

ownerZombieCount[msg.sender]++;

とこの二行が正解となりました。

2の部分は、何を増やしたいかっていうのを考えると、msg.senderは増やすっていう概念がないものだと思うので、増やしたいのはownerZombieCountだから、ownerZombieCount[msg.sender]という形になったと、、、変に?理解しましたw

そもそもmsg.senderで利用できるのって、その人のaddressってことだから、、数字(uint)と文字(string)の羅列が入ってくる事になるから、そのままZombieToOwnerに代入する事ができないって事であって、zombieToOwnerはuint型じゃないとKeyとして受け取れないからValue(値)は渡しませんよと言われちゃうって事なのかな。
14
だから一度、zombieToOwner[id] = msg.sender;とする事によって、コンパイルしてValueを格納する、という事になるのかな、、、コンパイルの使い方違う気がしますが、あくまでイメージとしてw

それだと少し納得ができるかな。

zombieToOwner[msg.sender]としてしまうと、msg.sender自体がuintではないので、mappingは機能しませんよ、っていうイメージ。。

う〜ん、、、ごめんなさい、よくわからんとです。。

まぁ悩んでも仕方あるまい、、、

進むうちに理解できることを祈りながら、次行きましょうw

チャプター4:Require

りくわぃあって読むのかね?w
56
この説明を読むと、requireは正しいかどうかチェックしてもらうプログラムってことですかね。

google翻訳さんで調べると「要求する」という意味。
使い方の例を見てみましょう。

11
//文章がまたして尻切れしておりますな、、

またしてもケッカク256さんの登場!!説明としてだけ出てきているので、keccak256の説明は何回目かに書いたブログを読んでくださいw

説明文の中に「solidityはネイティブで文字列比較ができない」とあります。

「”Vitalik” == “Vitalik”」という比較ができないから、keccak256を使用して乱数で同じ文字列かどうかを比較させているんですね!!知らなかったのでありがたい情報ですな!

はい、それではテストだ!!!

05
注意書きから読むと、答え合わせの際、本来であれば順番は違っても処理できるけど、このゲーム上ではownerZombieCount[msg.sender]を先に書いてくれって事ですなw

これそのまま使うんだよって、、答え教えてくれてます。
40

今回は1しかないので、そのまま進めます!requireステートメントを記述せよって事なので、先頭はrequireとして、内容をチェックしたいことは、「ownerZombieCount[msg.sender]が0であるか、」という事なので、

require(ownerZombieCount[msg.sender] == 0);

というのが正解になりますね。

ゲーム上だとこれで正解ですが、Solidityのプログラム的にはrequireの中身が逆でもOKです、というのが注意書きの説明ですね。require(0 == ownerZombieCount[msg.sender]);

ちなみにイコール(=)が二個っていうのは、比較演算子だからですね。

比較するために使う場合は2個使います。※今回の例
1個だと値を代入する場合となります。※ uint a = 0; //これはaに0を代入する

requireはこれから結構使いますので、正しいかどうかの判断をする際は

require(この中で判断する);という形で使うので、覚えておきましょう(自分に言い聞かせ)

というところで、午後の部はこの辺で終わりたいと思います!

msg.senderに関してだったり、mappingの格納に関しては今後もたくさん出てきそうなので、正解を見つけて理解できたら、このブログもリライトして再び更新しますね!

では次回も、「CryptoZombies」という事で、、お楽しみにしていただければと思います!

それではまた明日!

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