今日から第2章~。
新しく「マッピング」という言葉が出てきました。
なにそれ。面白い番組やってないかな~ってチャンネル変えまくるやつのこと?
、、、それはザッピング。
はいすみません。要するに連想配列みたいなものですね。
配列の値と、それを参照するキーのペアを作るということです。
CryptoZombiesの例だと以下のようになっていて、
//idを基にアドレスにゾンビを保管
mapping(uint => address) public zombieToOwner;
//addressに格納されるゾンビの数を保管
mapping(address => uint) ownerZombieCount;
という2ステップでアドレスにゾンビの数が保存される仕組みにしています。
ゾンビを作ったら、ちゃんと自分の持っているゾンビの数を増やさないといけません。それをレッスン2-2のマッピングを利用してやろうという回ですね。
ここでまず覚えるべきは「msg.sender」というグローバル変数。
この先めちゃめちゃ出てくるし、実際開発する時でも必ず使用する必須アイテム。FFのポーション。ドラクエのやくそう。(多分違う)
その関数を呼び出したユーザー(またはスマートコントラクト)の addressを参照できるようになります。逆にこれを使わないと一生関数を使えない。
CryptoZombieでのコードは以下のとおり。(太字が追加されたこのレッスンでコード)
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
zombieToOwner[id] = msg.sender;
ownerZombieCount[msg.sender]++;
NewZombie(id, _name, _dna);
}
新しく作ったidをmsg.sender(自分のアドレス)に紐づけて、それをownerZombieCountで、インクリメント(++)しているという流れですね。
createRandomZombie関数をゲーム中1回しか呼べないようにします。じゃないとずっとrandomなzombieをcreateできちゃうからね。そこで用いるのが「require」。PHPとかだと外部ファイル読み込みに使ってたような気がしますが、Solidityだと違うんだね。
それにしてもせっかく作った関数なのに、1回しか呼べないようにするなんて悲しいことだぜ。。。
function createRandomZombie(string _name) public {
require(ownerZombieCount[msg.sender] == 0);
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
上記のコードで「この関数を呼び出している人が持っているゾンビの数が0の時だけ」、createRandomZombie関数を呼び出すようにしているわけです。
今日はこのへんで。
では良いゾンビライフを!
【twitter】https://twitter.com/nogacrypto?lang=ja
【voicy】https://voicy.jp/channel/545
【note】https://note.mu/nogacchi