CryptoZombiesコード解説 ZombieFactory

CryptoZombiesのコードを解説します。コントラクトの関係全体を見たい方はこちらへ。

contract ZombieFactory

CryptoZombiesコントラクト群の基底となるコントラクトです。ゾンビの生成を担当し、生成されたゾンビの所有をしています。ゾンビ構造体の定義もこのコントラクトにあります。コントラクトオーナーのみ実行可能な関数を実装するため、Ownableを継承しています。

関連するレッスン、チャプター

  • Lesson 1
  • ソースコード・解説

    
    // 適用するsolidigyバージョン。solidityはバージョンにより結構言語仕様変わるので、正確に設定すべし。
    pragma solidity ^0.4.19;
    
    // 他のファイルのインポート
    import "./ownable.sol";
    import "./safemath.sol";
    
    // is で継承する。多重継承も可
    contract ZombieFactory is Ownable {
      // usingでライブラリを利用する。ここではuint256をSafeMathで拡張している
      using SafeMath for uint256;
    
      // イベントはフロントエンド(ex.JavaScript)で捉えることができる
      event NewZombie(uint zombieId, string name, uint dna);
    
      // uintはuint256のエイリアス
      uint dnaDigits = 16;
      // ** はべき乗
      uint dnaModulus = 10 ** dnaDigits;
      uint cooldownTime = 1 days;
    
      // 構造体、インスタンス生成時、この順で初期化。
      struct Zombie {
        string name;
        uint dna;
        uint32 level;
        uint32 readyTime;
        uint16 winCount;
        uint16 lossCount;
      }
    
      // 配列。pubulicで他のコントラクトからも参照可能に
      Zombie[] public zombies;
    
      // 連想配列。zombieToOwner[ゾンビID]でゾンビのオーナーアドレス
      mapping (uint => address) public zombieToOwner;
      mapping (address => uint) ownerZombieCount;
    
      // 内側感(private, internal)な関数名や、引数名は_で始める
      // private:同コントラクト内しか見えない
      // internal:継承したコントラクトからも見える
      // external:外からしか見えない
      // public:どこからでも見える
      function _createZombie(string _name, uint _dna) internal {
        uint id = zombies.push(Zombie(_name, _dna, 1, uint32(now + cooldownTime), 0, 0)) - 1;
        zombieToOwner[id] = msg.sender;
        ownerZombieCount[msg.sender]++;
        NewZombie(id, _name, _dna);
      }
    
      // view:コントラクトのストレージを更新しない。読み取りはする。
      // pure:コントラクトのストレージを一切読み書きしない。
      function _generateRandomDna(string _str) private view returns (uint) {
        // keccak256は組み込み関数。SHA-3を返す。
        // http://solidity.readthedocs.io/en/v0.4.19/units-and-global-variables.html
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
      }
    
      function createRandomZombie(string _name) public {
        // カッコ内の条件が成立していなかったら、処理中断
        require(ownerZombieCount[msg.sender] == 0);
        uint randDna = _generateRandomDna(_name);
        randDna = randDna - randDna % 100;
        _createZombie(_name, randDna);
      }
    }
    

    CryptoZombiesコード解説 ZombieFactory」への1件のフィードバック

    コメントは停止中です。