【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