初心者文系主婦がブロックチェーンを学ぶブログ

IT革命のビッグウェーブに乗り遅れた主婦が、ブロックチェーン革命の波にのるべく、ブロックチェーン技術を学ぶブログです。

【CryptZombies】レッスン4チャプター6&7:共通ロジックのリファクタリング

今まで、

require(msg.sender == zombieToOwner[_zombieId]);

を何度も使用してきましたが、attack関数にも同じロジックを使用します。
コードを綺麗にして繰り返しを避けるために、このロジックを独自のmodifierに格納します。

チャプター6のテストの実行

①ownerOfというmodifierを作成せよ。これは1つの引数_zombieId(uint)を受け取る。本文では、msg.senderがzombieToOwner[_zombieId]と同等であるようにrequire(要求)し、そうであれば関数を続けるようにせよ。もし修飾詞の構文を覚えていなければ、zombiehelper.solを参照してよい。

modifier ownerOf(uint _zombieId) {
  require(msg.sender == zombieToOwner[_zombieId]);
  _;
}

②feedAndMultiplyの関数定義を変更し、ownerOf修飾詞を使うようにせよ。

function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) internal ownerOf(_zombieId) {
 中略
}

③今はmodifierを使っているので、以下の一行は削除するのだ。require(msg.sender == zombieToOwner[_zombieId]);

削除します。


チャプター7のテストの実行

①changeName()関数をアップデートし、ownerOfを使用せよ。

changeName()関数にownerOfを追加します。これに伴い、require(msg.sender == zombieToOwner[_zombieId]);を削除します。

function changeName(uint _zombieId, string _newName) external aboveLevel(2, _zombieId) ownerOf(_zombieId) {
    zombies[_zombieId].name = _newName;
  }

②changeDna()関数をアップデートし、ownerOfを使用せよ。

changeDna()関数にownerOfを追加します。これに伴い、require(msg.sender == zombieToOwner[_zombieId]);を削除します。

function changeDna(uint _zombieId, uint _newDna) external aboveLevel(20, _zombieId) ownerOf(_zombieId) {
    zombies[_zombieId].dna = _newDna;
  }



お疲れさまでした!


<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network