CryptoZombiesコード解説 ZombieHelper

CryptoZombiesのコードを解説します。コントラクトの関係全体を見たい方はこちらへ。

contract ZombieHelper

有償によるレベルアップの仕組み、名前変更など、ゾンビに関するヘルパー関数が格納されているコントラクトです。

関連するレッスン、チャプター

  • Lesson 3, Chapter 11
  • ソースコード・解説

    
    pragma solidity ^0.4.19;
    
    import "./zombiefeeding.sol";
    
    contract ZombieHelper is ZombieFeeding {
    
      // レベルアップのためのお値段。小数になっているが、実際に格納される単位はwei。よってuintで大丈夫。
      uint levelUpFee = 0.001 ether;
    
      modifier aboveLevel(uint _level, uint _zombieId) {
        require(zombies[_zombieId].level >= _level);
        _;
      }
    
      // コントラクトに貯まっているethをコントラクトオーナーに払い出す。
      function withdraw() external onlyOwner {
        owner.transfer(this.balance);
      }
    
      function setLevelUpFee(uint _fee) external onlyOwner {
        levelUpFee = _fee;
      }
    
      // ethのやりとりのある関数には、payableをつける。
      // msg.valueはプレーヤーが支払ったethの額。
      function levelUp(uint _zombieId) external payable {
        require(msg.value == levelUpFee);
        zombies[_zombieId].level++;
      }
    
      // レベル2以上になると、ゾンビの名前を変更できる。
      function changeName(uint _zombieId, string _newName) external aboveLevel(2, _zombieId) onlyOwnerOf(_zombieId) {
        zombies[_zombieId].name = _newName;
      }
    
      function changeDna(uint _zombieId, uint _newDna) external aboveLevel(20, _zombieId) onlyOwnerOf(_zombieId) {
        zombies[_zombieId].dna = _newDna;
      }
    
      function getZombiesByOwner(address _owner) external view returns(uint[]) {
        // memoryはコントラクトにて永続化しない。関数内で寿命が尽きる。
        // memoryの配列は、必ず長さを指定。storageの配列だと、pushが使える。
        uint[] memory result = new uint[](ownerZombieCount[_owner]);
        uint counter = 0;
        for (uint i = 0; i < zombies.length; i++) {
          if (zombieToOwner[i] == _owner) {
            result[counter] = i;
            counter++;
          }
        }
        return result;
      }
    
    }
    

    CryptoZombiesコード解説 ZombieHelper」への1件のフィードバック

    コメントは停止中です。