開発するための最初の工程をやります!既出ではありますが、そういう繰り返しって身につくまでは大事な作業なのでやりましょう!keccak256というハッシュ関数の事だったり、新しくoracleというものに関しても少し説明しています。
、、最近は記事の冒頭部分がTwitterで掲載されているのを見て、雑談ではなく、こういう事しているのか、と思える事を頭に書くようにしています。
テイストが変わったって思ったでしょう?w
まだまだ変える部分はたくさんあると思っているので、小さいながらコツコツやっていきますよ!
CryptoZombies | イーサリアムでのゲーム開発を学ぶ
午前第二部、開演します!
さてさて、ゾンビバトルという事で早速実装しよう!!
それではテストだ!!
おお〜!!こういうまっさらな状態ってなかったですね!!今までだとゾンビ先生が省略してやってくれてたからね。ありがたいですな!!
今回は新しいコントラクトってどうやって作ってたっけ?というのを思い出しつつ、最初は答えを見ずに、自分でこんな感じじゃなかったかな?ってやってみよう!
書いてある通り、zombiehelper.solを参照すればわかるからね!
1では、Solidity version ^0.4.19を宣言せよ!という事ですね。なんか最初についてたよな、、、、
pragma solidity ^0.4.19;
となりますね!不安な方は私のブログ過去記事参照して見てください
👉CryptoZombies徹底解剖①
2では、importせよ!と言っているので、importのやり方は、、、
import “./zombiehelper.sol”;
となりますね。ダブルクォーテーションで囲み〜の、ドットスラッシュ入れてからimportするタグ名を入力する、っていう事ですね。この時はZombieHelper.solではないので、過去記事見てみててくださいね!
3では、新規コントラクト作成ですね、しかも継承もするとなると、、、
contract ZombieBattle is ZombieHelper {
}
となりますね!
まとめると、、
pragma solidity ^0.4.19;
import “./zombiehelper.sol”;
contract ZombieBattle is ZombieHelper {
}
となりますね!!
基本的な事なので、これは説明しなくても良さそうですね!!
では次っ!!
乱数、と聞いて思い出すワードがないだろうか、、、、私はすぐにケッカク256さんの出番ではないかと思ったが、、、どうだろう、、
きた〜!!ケッカク256さん!!w
説明は過去記事参照👉CryptoZombies徹底解剖④
上記の例では尻切れトンボちゃんなので書きますが、randNonce)) % 100;となっております。
このコードとしては「% 100」としているので100種類を生み出すためにケッカクさんをつかって計算しているって事ですね。% 100というのは剰余算の計算式なので、余りを結果として出す方式です。
間にrandnonce++;というコードが入ってますが、これは同じ値を返さないために、keccak256が捻出するランダム値をかえるために必要なものですね。同じユーザーがやっても、違うゾンビが生まれるという仕組みにするためには、ここで変化を持たせるというわけですね。このコードがないと、まったく同じゾンビが生まれてしまうので、ある意味バグみたいなもんですね。ゲームとしてもつまらないものになりますしwまぁ最初にnowが入っているので、秒単位で同じキャラを作るとしたらかなりの早業ですけどねw
ただし、ケッカクさんにも欠点があるという事ですね。同じ値を渡したら同じ乱数を渡してしまうので、完全なセキュリティとしては弱いんですよね、、そこを悪者は狙ってくるのだと、、、
悪者でなくても、鍵が空いてドアが開いていたら入ってしまいますよね、そこを通って次の仕事をしにいってしまうという事で考えておきましょう。
詳しいことは言えませんが、無限ループで勝ち続ける仕組みに変えることができてしまうよ、って事ですかね。お金が絡んでくるゲームであれば、そんな弱点を持っていたら、あっという間に全てもってかれちゃいますね、、、それはやばい、、、
負けない仕組みに変えられてしまってはどうにもなりません、じゃあどうすれば、、、
ほほぅ、oracleとな、、、なんじゃそりゃ?w
調べると大規模なデータベースの事らしい、、いろんなデータを格納している巨大倉庫という事なので、そこのデータを利用して乱数を生成してやれば、より安全な乱数を生み出せる、という事なのかな。
ブロックを解くというのは、非常に時間がかかりコストもかかる、、だがそれに見合う以上の利益が出る場合、ハッキングする価値はある、と言いたそうだね。
マイニングの考え方みたいなもんですかね、、坑夫は山を砕き、資源を得る的なね。重労働だけどその対価が高ければやりますよね。そんな感じか。
トレードオフとな??意味としては複数の条件を同時に満たす事ができない関係、との事だ。
つまりは、利益がでない事に対して、だれも手出ししませんよ、という事ですな。
人生で言えばトレードオフのものを率先してやれる人が成功する、と思う!
使い方は違うと思うが、言いたい事がなんとなく伝わらないだろうか、、w
お金にならないのをわかってて、投資しつつ開拓していくと考えるイケハヤさん的な考え方って事ね!
しかも後々、そのoracleを使って外部から安全な乱数を生成するのもやるだとっ!!
なんて良いゾンビなんだっ!!ばかやろ〜!!w
ゾンビってみんな悪い奴だと思ってたけど、、、こんなにも良いゾンビがいるのか!!w
臭そうだけど抱きしめたくなりますねwその臭さもお前の個性で好きだ!という感情ですw
1では、uint型のrandNonceに0を入れればいいのだから、
uint randNonce = 0;
ですな!簡単ですね。
2では、関数を宣言して、引数1つにinternal関数、returnsでuintを返す、なので
function randMod(uint _modulus) internal returns(uint) {
}
となりますね。
3では、その中でrandNonceを増やさなくてはとの事なので、
randNonce++;
となります。
4では、長い文章の後にreturnせよ!と言っているので、、
return
がスタートとして始まり、uint型に計算という事なのでuint()として、、その中で乱数を生成するためのkeccak256()を入れて、引数として、now,msg.sender,randNonceを渡すところまで、まず考えれば、、、
uint(keccak256(now, msg.sender, randNonce))
となり、その値を% _modulusにしてreturnせよ、なので、
% _modulus;
となるので、
4をまとめると、、
return uint(keccak256(now, msg.sender, randNonce)) % _modulus;
となるんじゃないでしょうか?w
おおっ!!合ってたw
こういう一発でクリアできた時って、たぶんアドレナリン漏れてるくらいでてますなw
チャプター4のテストをまとめると、、
uint randNonce = 0;
function randMod(uint _modulus) internal returns(uint) {
randNonce++;
return uint(keccak256(now, msg.sender, randNonce)) % _modulus;
}
となりますね!!
あ〜もうこれは、ゾンビさんが優しいからですね。本当ありがとう!!
長くなってしまいましたが、こんな感じで理解が深まりました!!
本当、今日の更新はゾンビを抱きしめたいと思いましたw
勉強して終わってしまっては意味がないので、それを応用して新しいアプリを開発してみたり、自分の頭の中で面白そうな構造を描き、それを形にしていく事でさらに理解していきますからね。
いや〜妄想が膨らむ、、、、ゾンビは友達として参加させたいという気持ちがあるので私のDappができたら、ゾンビは味方だった、、というような設定で登場させますw
そしてめちゃくちゃ強力なキャラにして、ゾンビなのにホーリー使えるの!?ぐらいのとんでもない度肝も目ん玉も飛び出すくらいのキャラクターにしたいと思いますw
という訳で今日のところはおしまいにします!!
母の誕生日という事でお寿司とケーキを買いに、昼から出ますが、本屋さんにも少し立ち寄って目当ての本を物色してきます!
あと一時間ほどお昼まであるので、天気も良い事だしお外でKindle本を読む時間にしたいと思います!
ちなみに読む本は、、、、
ですね!文字に疲れたら、最近入れた「mikan」というアプリで単語を学ぼうと思います。
これもめちゃくちゃ良いんですよね、、、教材としてというよりも、みかんのキャラ設定がなかなかじわる、、、w今中高生の間ではやってるらしい「脳みそ夫」的なキャラの命名があってなんだっけかなぁ、、「かわむけお」?的な名前のキャラが出てきたときに、このアプリ続けよう!って決心しましたw
やった人しかわからない内容だと思うので、英語の単語を勉強したい人は「mikan」アプリを一緒にやりましょう!なんか競える機能もあるみたいなので、、まずは無料ダウンロードでチャレンジしてみてください!
CryptoZombies | イーサリアムでのゲーム開発を学ぶ
ではでは、またお会いしましょう!
また明日!