CryptoZombiesのコードを解説します。コントラクトの関係全体を見たい方はこちらへ。
contract ZombieFactory
CryptoZombiesコントラクト群の基底となるコントラクトです。ゾンビの生成を担当し、生成されたゾンビの所有をしています。ゾンビ構造体の定義もこのコントラクトにあります。コントラクトオーナーのみ実行可能な関数を実装するため、Ownableを継承しています。
関連するレッスン、チャプター
ソースコード・解説
// 適用する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件のフィードバック
コメントは停止中です。