【第105日目】42歳の金のないキモいおっさんがブロックチェーンエンジニアを目指す日記「黙々と写経中」
こんばんは。ひろあきです。9日ぶりの更新です。日にちの経つのは早いですね。それにひきかえ、こちらのプログラミング学習は遅々として進まないといった感じです。
それでも進展もあって、前回Node.jsの学習で詰まったと書きましたが、それを見た読者の方からアドバイスを頂きまして、無事Nord.jsでMongoDBに接続することができました。おさむくんさん、ありがとうございました。参考にした記事はこちら。
一方、CryptoZombiesの写経の方はなかなか進みませんね。まあ、学習時間を確保できていないのが1番の原因ですが、きちんと理解しようとするとやはり時間がかかるわけです。それでも何とかレッスン2の終盤まで来ることができました。せっかくなので、写経したコードを貼ってみますね。
pragma solidity ^0.4.19; // solidityのバージョンを宣言する
contract ZombieFactory { //ZombieFactoryというコントラクトを作成
event NewZombie(uint zombieId, string name, uint dna); // イベントNewZombieの宣言。※パラメータ変数名にアンダースコアは付けない
uint dnaDigits = 16; // ゾンビのDNAの桁数
uint dnaModulus = 10 ** 16; // 10の16乗
struct Zombie { // 構造体。複数のデータ型を持つことができるデータ型の一種
string name;
uint dna;
}
Zombie[] public zombies; // Zombie構造体のpublicな可変長配列。名前はzombies
mapping (uint => address) public zombieToOwner; // zombieToOwnerというpublicのマッピング。キーがuint、バリューがaddress
mapping (address => uint) ownerZombieCount; // ownerZombieCountというマッピング。キーがaddress、バリューがuint
function _createZombie(string _name, uint _dna) internal { // internal関数_createZombie
uint id = zombies.push(Zombie(_name, _dna)) - 1; // 構造体Zombieを配列zombiesに追加する。idについては????
zombieToOwner[id] = msg.sender; // コントラクトを呼び出した1番最初のアドレスをマッピングzombieToOwner[id]に格納
ownerZombieCount[msg.sender]++; // マッピングownerZombieCount[msg.sender]を1つずつ増やす
NewZombie(id, _name, _dna); // イベントNewZombieを実行する
}
function _generateRandomDna(string _str) private view returns (uint) { //private・view関数_generateRandomDna。uintの戻り値を返す
uint rand = uint(keccak256(_str)); // _strの16進数のハッシュ値をuintに型キャストしたものをrandに格納
return rand % dnaModulus; //randをdnaModulus(10の16乗・1京)で割った余りを返り値として返す
}
function createRandomZombie(string _name) public { // public関数createRandomZombie。上の2つの関数を統合するもの
require (ownerZombieCount[msg.sender] == 0); //ownerZombieCount[msg.sender]が0でなければ、エラーを返し以降の処理を中止する
uint randDna = _generateRandomDna(_name); // 関数_generateRandomDnaを実行し、戻り値をrandDnaに格納
_createZombie(_name, randDna); // 関数_createZombieを実行し、値を配列zombiesに追加
}
}
pragma solidity ^0.4.19;
import "./zombiefactory.sol"; // 同じディレクトリにあるzombiefactory.solをインポートする。継承した場合は同時にインポートもしなくてはならない
contract KittyInterface { //インターフェイスKittyInterface。
function getKitty(uint256 _id) external view returns ( //クリプトキティーズのgetKitty関数。カッコ内の10の返り値を返す
bool isGestating, // boolとは真偽(論理)型変数。true(真)またはfalse(偽)の2値のみが格納可能。デフォルト値はfalse。
bool isReady,
uint256 cooldownIndex,
uint256 nextActionAt,
uint256 siringWithId,
uint256 birthTime,
uint256 matronId,
uint256 sireId,
uint256 generation,
uint256 genes
);
}
contract ZombieFeeding is ZombieFactory { // コントラクトZombieFeedingはコントラクトZombieFactoryを継承している
address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; //クリプトキティーズのコントラクトのアドレス??
KittyInterface kittyContract = KittyInterface(ckAddress); //インターフェイスKittyInterfaceのKittyContractに上記アドレスを紐付ける
function feedAndMultiply(uint _zombieId, uint _targetDna) public { // public関数feedAndMultiply
require(msg.sender == zombieToOwner[_zombieId]); // msg.senderがゾンビのオーナーであるかどうかを判定する。違う場合はエラーを返して処理を中止する
Zombie storage myZombie = zombies[_zombieId]; // ゾンビのDNAを格納する。構造体ZombieのmyZombie(storage格納)変数をzombies配列内の_zombieIdインデックスと同じにする
_targetDna = _targetDna % dnaModulus; // _targetDnaが16桁かどうかを確認する
uint newDna = (myZombie.dna + _targetDna) / 2; // 構造体ZombieのmyZombieのdnaの値と_targetDnaを足して2で割り、それを変数newDnaに格納する
_createZombie("NoName", newDna); // internal関数_createZombieを実行する
}
function feedOnKitty(uint _zombieId, uint _kittyId) public { // public関数feedOnKitty
uint kittyDna; //変数kittyDnaを定義
(,,,,,,,,, kittyDna) = kittyContract.getKitty(_kittyId); // インターフェイスKittyInterfaceのKittyContractのgetKitty関数を実行し、10番目の返り値だけをkittyDnaに格納する
feedAndMultiply(_zombieId, kittyDna); // 関数feedAndMultiplyを実行する
}
}
これだけ時間かけてもmappingとかはまだ完全に理解した自信はないです…。あと、わからないところはコメントで??って書いてます。それでも前回CryptoZombiesをやったときよりは格段に理解度が上がっているのは、成長した証なんだなぁとしみじみ思いますね。
ところで、学習期間がついに100日を超えましたが、次回のnoteではその振り返りと今後の学習方針について書いてみたいと思います。それではまた。おやすみなさい。
〈7月7日【第97日目】の学習内容〉
・CryptoZombies写経~Lesson2-2
・学習時間 約4.75(Solidity等)+0(Node.js等)+0(JavaScript等)+0(HTML・CSS)時間
〈7月8日【第98日目】の学習内容〉
・学習時間 約0(Solidity等)+0.5(Node.js等)+0(JavaScript等)+0(HTML・CSS)時間
・14w:16.75h、TOTAL:235.25h
〈7月9日【第99日目】の学習内容〉
・学習時間 約0(Solidity等)+0(Node.js等)+0(JavaScript等)+0(HTML・CSS)時間
〈7月10日【第100日目】の学習内容〉
・Qiita『Node.js用MongoDBライブラリmongooseの基本操作まとめ』
・学習時間 約0(Solidity等)+2.25(Node.js等)+0(JavaScript等)+0(HTML・CSS)時間
〈7月11日【第101日目】の学習内容〉
・CryptoZombies写経~Lesson2-6
・学習時間 約2.25(Solidity等)+0(Node.js等)+0(JavaScript等)+0(HTML・CSS)時間
〈7月12日【第102日目】の学習内容〉
・CryptoZombies写経~Lesson2-7
・学習時間 約1(Solidity等)+0(Node.js等)+0(JavaScript等)+0(HTML・CSS)時間
〈7月10日【第103日目】の学習内容〉
・CryptoZombies写経~Lesson2-8
・学習時間 約0.75(Solidity等)+0(Node.js等)+0(JavaScript等)+0(HTML・CSS)時間
〈7月10日【第104日目】の学習内容〉
・学習時間 約0(Solidity等)+0(Node.js等)+0(JavaScript等)+0(HTML・CSS)時間
〈今日の学習内容〉
・CryptoZombies写経~Lesson2-12
・学習時間 約2(Solidity等)+0(Node.js等)+0(JavaScript等)+0(HTML・CSS)時間
・15w:8.25h、TOTAL:243.5h