【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進数を生成」とあるので、次にようになります。
次に、青線を見ていきます。
上で作成した疑似乱数の16進数をuintに型キャストするので、次のようになります。
最後に、オレンジ線を見ていきます。
上でuintに型キャストしたものをrandという名前のuintに格納します。
②DNAは16桁になるようにしたい。(dnaModulusを覚えているか?)。そこで次の行では上で求めた値のdnaModulusによる剰余(%)をreturnするようにせよ。
①で求めた値について、dnaModulusによる剰余をreturnするので、次のようになります。
余談ですが、DNAを16桁にする場合、なぜdnaModulusによる剰余にする必要があるのでしょうか?
dnaModulusは、チャプター4で10のdnaDigits乗(=10の16乗)に設定しました。
任意の数字を10の16乗で割った余りは、いつでも16桁になります。
例:11111111111111111111を10000000000000000(10の16乗)で割ると、
商は1111、余りは1111111111111111で、16桁になります。
お疲れさまでした!
<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network