🧟‍♂️

【solidity初心者向け】CryptoZombiesをもっと丁寧に解説!(レッスン1-11, 1-12)

2022/04/12に公開

前回に続いてCryptoZombiesを「より詳しく」解説していこうと思う。

「CryptoZombies難しい・・・」と悩んでいる人を見かけたら、本記事のシリーズを紹介してもらえると嬉しい。

そして、悩んでいるあなたにも有益な記事となることを願っている。

この記事の対象者

この記事の対象は以下のような方である。

  • solidityを始めてみたけど、CryptoZombies難しい
  • なんとなく分かったが、ちゃんと理解できてない部分もある

あくまで理解がなかなか追いついていない人向けの記事だということを理解いただきたい。

解説するチャプター

今回解説するのは、レッスン1のチャプター9とチャプター10である。

▼ チャプター11のURL
https://cryptozombies.io/jp/lesson/1/chapter/11

この記事で得られること

この記事ではざっくりと以下のことが学べる。

  • 「型」とは何かが理解できる
  • 型のキャストが理解できる

それではさっそくやっていこう。


チャプター 11: Keccak256と型キャスト

このチャプターでは、ゾンビのDNAをランダムに作成する関数を実装していく。

先にこのチャプターでの答えを載せておくので、参考にして頂きたい。

pragma solidity ^0.4.19;

contract ZombieFactory {

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

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

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

    function _generateRandomDna(string _str) private view returns (uint) {
        // ランダムな16桁の数を作成
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }
}

✅ Keccak256とは何か?

keccak256とは一言で言えば「ハッシュ関数」である。
とは言っても「ハッシュ関数とは何か?」となるので、もっと簡単に説明する。

ハッシュ関数とは、入力した文字に対してランダム(に見える)な文字列を返してくれる関数である。
ランダムとは言ったものの、特定の計算に従って算出された値であり、同じ値を入れれば必ず同じハッシュとなる。

ただ、これは実際に使う時に思い出して調べればいいので、今は「そうなんだ〜」くらいで問題ない。

✅ 型とは何か?

このチャプターでは、型キャストについて説明する。
ただしその前に、「型」について理解しておく必要がある。

「型」とは、stringuint256intなどのいわゆる"データの種類"のことを示す。
string型、uint256型、int型などという。

solidityでは、変数名の前に指定しているものが「型」である。
以下のnameはstring型である。

string name = "zombieA";

そして、構造体も「型」である。
以下のサンプルコードは、以前の記事で紹介したものである。

// ゾンビ構造体
struct Zombie {
    string name;
    uint dna;
}

// 新しいゾンビを作る
Zombie zombieA = Zombie("ゾンビA", 123);

zombieAの前にZombieとついていることから、Zombieも型である。
string型などと同じZombie型である。

Zombie型(構造体)は"複数の型をまとめた型"、というイメージである。

✅ 型のキャストとは何か?

ここまでで型を理解できたと思うので、次はキャストについて勉強していく。

「型のキャスト」とは、言い換えると「型の変換」である。

以下のコードは、「keccak256でハッシュに変換された文字列(string)をuint型にキャストする」というものだ。

function _generateRandomDna(string _str) private view returns (uint) {
    // string型の _str をハッシュ化して、uint型にキャスト
    uint rand = uint(keccak256(_str));
    // 16桁に統一
    return rand % dnaModulus;
}

そして、チャプター3で話していた通り、16桁になるように10の16乗(dnaModules)で割った余りを求める。

忘れてしまった人は、再度この記事を読んで復習してもらいたい。

ここまでできたら今回はOK。

お疲れ様でした。


まとめ

今回は

  • 「型」とは何か
  • 型のキャストとは何か

を紹介しました。
いかがだったでしょうか?

また、間違っていたり追加した方がいいことがあったらコメントをして頂きたいです!
皆さんにより良い情報を届けたいので、必要に応じて修正していきます。

それでは引き続き解説出すので、そちらも参考にしてください!!

Discussion