【CryptoZombies】lesson1 Chapter 11: Keccak256 and Typecasting

Ethereum has the hash function keccak256 built in, which is a version of SHA3. A hash function basically maps an input into a random 256-bit hexadecimal number. A slight change in the input will cause a large change in the hash.

イーサリアムにはSHA3のバージョンの一つであるkeccak256が組み込まれています。ハッシュ関数は基本的には、文字列をランダムな256ビットの16進数にマッピングする機能。文字列をほんの少しでも変更すれば、ハッシュは大きく変わるで気をつけましょう。


〇ハッシュ関数とは?
入力に対応する適当な値(適当に見える値)を返してくれる関数のこと。
こちらの記事が分かりやすい

〇Keccak-256とは?(ケチャック)
イーサリアムで用いられているハッシュ関数のこと。


It's useful for many purposes in Ethereum, but for right now we're just going to use it for pseudo-random number generation.

イーサリアムのいろいろな場面で使用できますが、ここでは擬似乱数生成に使用していきます。


Also important, keccak256 expects a single parameter of type bytes. This means that we have to "pack" any parameters before calling keccak256:

また、重要なこととして、keccak256はbytes型のパラメータを1つだけ想定しています。これは、keccak256 を呼ぶ前に、どんなパラメータでも「パック」しなければならないことを意味します。

Example:

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256(abi.encodePacked("aaaab"));

//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
keccak256(abi.encodePacked("aaaac"));

As you can see, the returned values are totally different despite only a 1 character change in the input.


Typecasting

Sometimes you need to convert between data types. 

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

Take the following example:

uint8 a = 5;
uint b = 6;
// throws an error because a * b returns a uint, not uint8:
uint8 c = a * b;
// we have to typecast b as a uint8 to make it work:
uint8 c = a * uint8(b);

In the above, a * b returns a uint, but we were trying to store it as a uint8, which could cause potential problems. By casting it as a uint8, it works and the compiler won't throw an error.

この例ではa * bはuintを返すが、uint8で格納しようとしているから、問題が発生することになる。uint8にキャストすることで、正常に動作する上にコンパイラもエラーを吐き出すことがなくなる。

test

Let's fill in the body of our _generateRandomDna function! Here's what it should do:

1.The first line of code should take the keccak256 hash of abi.encodePacked(_str) to generate a pseudo-random hexadecimal, typecast it as a uint, and finally store the result in a uint called rand.

2.We want our DNA to only be 16 digits long (remember our dnaModulus?). So the second line of code should return the above value modulus (%) dnaModulus.

pragma solidity ^0.4.25;

contract ZombieFactory {

   uint dnaDigits = 16;
   uint dnaModulus = 10 ** dnaDigits;

   struct Zombie {
       string name;
       uint dna;
   }

   Zombie[] public zombies;

   function _createZombie(string memory _name, uint _dna) private {
       zombies.push(Zombie(_name, _dna));
   }

   function _generateRandomDna(string memory _str) private view returns (uint) {
       uint rand = uint(keccak256(abi.encodePacked(_str)));
       return rand % dnaModulus;
   }

}


accomplish:成し遂げる
convert:変更する
digit:桁


この記事が気に入ったらサポートをしてみませんか?