Solidity言語

レッスン3:Solidityの高度なコンセプト⑥

嬉しい出来事がありましてね、、、昨日書いたリステリンの記事が面白いと言っていただけた!!自分でもリステリンの事をあそこまでかけるとは思っていなくて、しかもまだまだエピソードがあるし、書けるなって思ってるんですよねwいや〜本当に嬉しかった!!ありがとうございます(T_T)/

その記事はこちら👉👉 早起きして時間を作りたいだと?秘訣を教えよう!

noteにもほんの少しだけ書きましたが、、、ブログとも連携できるように色々設定したいなと考えております。

いや〜お世辞だとしてもめっちゃ嬉しいです!!!!私のモチベーションはこんなにも簡単に上がるんだなって、単純人間だという事も知りましたw

さてさて本題に突入しますか!

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

それでは始めよう!

チャプター7:Public関数とセキュリティ
54
ここの話は既出ですね、、セキュリティ上publicのままだと、誰にでも操作されてしまうので、しっかりとしたルールをつけてしまって、いじれないようにしましょう、という内容ですね。

onlyOwnerだったり、publicではなくinternalで宣言するなり、方法はありますよ、とのこと!
 

さっそくだがテストだ!!!
03

1では、public関数をinternalに変更し安全にせよ、との事なので、ここは簡単ですな!
publicをそのままinternalに代えるだけですからね!

function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) internal {}

となります!
2では、この関数にcooldownTimeを実装するために、requireステートメントを追加して_isReady()をチェックさせて、それをmyZombieに渡すようにすればいい。との事なのだが、、

私はここでミスを犯したので共有します。

そもそもrequire()の形として、確認する、というワードで判断しているのだが、今回はチェック(確認)させてそれをmyZombieに渡す、という内容になっている。。

チェックだけじゃなく、それをmyZombieに渡す、、、とな??

今までの使い方としてAとBが同等であるか確認する、というような使われ方をしていた。

例として、require(A == B);のような形だ!ここでこの返答としてTrue(正しい) =同等ですよ!、という答えならそのまま関数を実行する、という形式には慣れたのだが今回は違う。。

myZombieに渡す、、というところがひっかかってしまい、疑問として頭の中をぐるぐるとまわっている。。

答えはこうなのだ。

require(_isReady(myZombie);

確認対象のAだけしかない、、、Bがないパターンというのもあるのだと知ったw

そしてこのmyZombieというのは、昨日悩んだ挙句理解できなかったstorageポインタで使われいてるstorageポインタだ。。

53

このコードを入力し確認させることにより、myZombieのデータに_isReady()の返り値の(_zombie.readyTime <= now)が渡されるってことになるってことなのか、、、

文章の続きに、こうすればクールダウン時間が過ぎている場合のみ関数を呼び出すことができるようになる。と書かれている。。

requireステートメントのことをもう少し調べてみると、、そこには「正しければ(true)実行し、正しくなければ(false)そこでコントラクトの実行を中止し、実行前に戻し、残りのガスを戻す」とある。

ifと感覚的には似ているものだという認識にした方がわかりやすそう。。

requireで判定された結果が、trueならそのまま続きを継続して実行し、falseならその場でそのコントラクトの実行を中止し、実行前に戻す。ということなのね。

だからrequireは分岐として扱うものなんだな、と考えた方がよさそうね。

言葉ではtrueなら実行する、っていうのはわかったつもりだったけど、深い理解はできていなかったのね。。

まだまだ調べる余地はありそうですな!!うん、わからなかった事がまた少し理解できるようになったのはプラスだからね、、、ヘボプログラマレベル1がレベル2になったと、思っておこうw

まだまだ理解するには苦労しそうだが、歩き続けた先には理解してコーディングしている自分がいるんだと想像を膨らませるようにして、頑張ろう!!

はいっ次っ!!

3では、関数を呼び出して実行せよ。との事なのでそのままですね。

_triggerCooldown(myZombie);

となります。

まとめると、

1では、publicをinternalに変更するだけ

2では、require(_isReady(myZombie));を入力して確認させて、myZombieに渡すと。

3では、_triggerCooldown(myZombie);として、_triggerCooldown()を実行させる

となります。

今更ながら、プログラミングをする上で、Owner側とUser側の視点を持つ必要がある気がしますw

Userはゲームを楽しむ人で、Ownerはゲームを作成する人、、

このmyZombieというワードにしても、日本語訳すると「私のゾンビ」なので、ownerのゾンビなのか、userのゾンビなのかという点で言うと、「userのゾンビ」という事ですよね?

Ownerはあくまで開発者であり、作成者なので私のゾンビ(myZombie)を所有する立場ではなく、遊んでくれるUserが所有するゾンビの事なのだと理解しておかないと、それこそワケワカメになるという事だ。

私の足りない頭では、常にこの問
題がぐるぐるまわっている、、w

myZombieってそもそもなんなんだっけか??私のって誰だ???

ぐるぐるぐるぐるぐる。。。。。。

プシュ〜と音を立ててフリーズしますw

だからこそ、頭の中で決め事を作って、Ownerは開発者なのだからこのゲームを作って、遊んでもらう仕組みを考える側だと。

Userはこのゲームを遊ぶ人たち側だ、と。

この話しをしたら、超ド級の素人エンジニアだなって、わかりますよねw

だからこそ、こうやって学んでは悩み、解決してはまた悩んで、を繰り返すのです。

そうしないと理解していけないし、本当に適当に進んだって、少しは理解できるかもしれませんが、物にはならないですからね。

地道ですが、こんな感じで成長していく次第ですので、遅くてイライラするかもしれませんが、見守っていただけると幸いです。

という事で今回はここまで!!
すぐ終わりそうな内容だったのにまたハマってしまいましたね。。

次回は次のチャプターですな。

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

それではまた後ほど!!

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