LoginSignup
2
3

More than 5 years have passed since last update.

CryptoZombies #1 備忘録

Last updated at Posted at 2018-09-23



こんにちは。サトミです。
普段は、dapps開発、ブロックチェーンリサーチなどをしています。
ブロックチェーンしかTweetしないアカウントを最近作りました。
dapps、海外のブロックチェーンニュース...etc=>@satomin_dev

本エントリは、CryptoZombiesの備忘録です。

CryptoZombiesとは?



preview-zombie.png

Loom Networkが提供している、Solidityゲーム感覚で学べるサービス。
※ Solidity:Ethereum上にデプロイするスマートコントラクトを書くための言語

おそらくdapps開発者が一度は触るもので、もはや通過儀礼的な立ち位置。

概要

6つのレッスンがある。

  1. ゾンビファクトリーの作成
  2. ゾンビが人間を襲う
  3. Solidityの高度なコンセプト
  4. ゾンビのバトルシステム
  5. ERC721とクリプト収集物
  6. アプリのフロントエンドとWeb3.js

6回に分けてそれぞれのまとめを置いておきます。

1. ゾンビファクトリーの作成

Solidityのコンパイラのバージョンの宣言。
※ CryptoZombiesでは0.4.19を指定する。

pragma solidity ^0.4.19;

contract ZombieFactory {
}

理由:将来コンパイラのバージョンが原因でコードが壊れることを防ぐ

状態変数の定義
※ 状態変数:Ethereumブロックチェーンに記録される。

pragma solidity ^0.4.19;

contract ZombieFactory {
    uint dnaDigits = 16;
}

uint:符号なし整数のデータ型で、256bitのエイリアス

- 構造体

複数のプロパティを持つデータ型を作成できる。

pragma solidity ^0.4.19;

contract ZombieFactory {
    uint dnaDigits = 16;  
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }
}

ここではZombieという構造体を作成し、string型のnameとuint型のdnaをもたせている。

- 配列

メモリを無駄遣いしないように、2種類の配列がある。
固定長配列

uint[2] fixedArray;

可変長配列

uint[] dynamicArray;



zombiesという配列を作り、createZombiefunctionの中で、新しいZombieを配列に格納していく。

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) {
        zombies.push(Zombie(_name, _dna));
    }

}

- Private / Public

Public:誰でもコントラクトの関数を叩け、実行できる。
Private:定義されたコントラクト内でのみ使用することができる。
※ デフォルトはPublicで設定されている。

createZombie関数をPrivateにする。
その際、createZombie => _createZombieに変更するのが通例。

- View / Pure

View:ブロックチェーンに記録、値の変更、書き込みができないが、読み込みはできる。
Pure:書き込み、読み込み共にできない。

_generateRandomDna関数をprivateviewで設定し、戻り値をuint型の16ケタに設定する。

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) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

}

returns (type):関数の宣言に戻り値の型を含む
keccak256():16進数に変換したハッシュ値を求める(同じ文字からは同じハッシュ値)
uint():型キャスト

今まで作ってきた関数をcreateRandomZombie関数にまとめる。

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) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

- Events

・コントラクト上で発生したことをDappsなどのクライアントに通知することができる。
・渡されたパラメータはトランザクションのログに保持される。

イベントの宣言はこのような感じ。

event EventName(type params);

NewZombieというEventを宣言して、指定のパラメータを渡す。

_createZombie関数内で、zombies配列に追加されたら、イベントを発火させる。

ゾンビのidには、配列のインデックスを付与させる。
array.push()関数が配列の要素数を返すことを利用し、array.push()-1で対応。

pragma solidity ^0.4.19;

contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint dna);
    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        NewZombie(id, _name, _dna);
    } 

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

    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

DONEです、お疲れ様でした。

次回: 「ゾンビが人間を襲う」


bportal

bportal_service@2x.png

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3