【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:桁
この記事が気に入ったらサポートをしてみませんか?