初心者文系主婦がブロックチェーンを学ぶブログ

IT革命のビッグウェーブに乗り遅れた主婦が、ブロックチェーン革命の波にのるべく、ブロックチェーン技術を学ぶブログです。

【CryptZombies】レッスン1チャプター11:Keccak256と型キャスト

keccak256

イーサリアムにはSHA3というハッシュ関数のバージョンの一つであるkeccak256が組み込まれています

ハッシュ関数は基本的には、文字列をランダムな256ビットの16進数に位置づける機能です。

文字列を1字でも変更すれば、ハッシュ値は大きく変わってしまいます。

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");
//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
keccak256("aaaac");

 

型キャスト

場合によっては、データ型を変更する必要があるときがあります。

uint8 a = 5;
uint b = 6;
// a * b はuint8ではなくuintで返すから、エラーになる:
uint8 c = a * b; 
// 正しく動作させるために、bをuint8に型キャストさせる:
uint8 c = a * uint8(b); 

この例では、a*bはuintを返しますが、uint8で格納しようとしているので、問題が発生することになります。

uint8にキャストすることで、正常に動作する上にコンパイラもエラーを吐き出すことがなくなります。

※チャプター3で、「uint」はデフォルトで「uint256」(=256ビットの符号なし整数)を意味していることを学習しましたが、覚えていましたか?

 

テストの実行

_generateRandomDna関数の中身を書いてみよ。

①コードの最初の行は _strのkeccak256ハッシュを取得し、疑似乱数の16進数を生成し、それをuintに型キャストしてrandというuintに格納せよ

まず、赤線を見ていきます。

「_strのkeccak256ハッシュを取得し、疑似乱数の16進数を生成」とあるので、次にようになります。

f:id:nomadomama:20181118004619p:plain

 

次に、青線を見ていきます。

上で作成した疑似乱数の16進数をuintに型キャストするので、次のようになります。

f:id:nomadomama:20181118004833p:plain

 

最後に、オレンジ線を見ていきます。

上でuintに型キャストしたものをrandという名前のuintに格納します。

f:id:nomadomama:20181118005043p:plain

 

②DNAは16桁になるようにしたい。(dnaModulusを覚えているか?)。そこで次の行では上で求めた値のdnaModulusによる剰余(%)をreturnするようにせよ。

①で求めた値について、dnaModulusによる剰余をreturnするので、次のようになります。

f:id:nomadomama:20181118005241p:plain

 

余談ですが、DNAを16桁にする場合、なぜdnaModulusによる剰余にする必要があるのでしょうか?

dnaModulusは、チャプター4で10のdnaDigits乗(=10の16乗)に設定しました。

f:id:nomadomama:20181118005558p:plain

任意の数字を10の16乗で割った余りは、いつでも16桁になります。

例:11111111111111111111を10000000000000000(10の16乗)で割ると、

商は1111、余りは1111111111111111で、16桁になります。

 

お疲れさまでした!

 

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network