🦔

Solidity初心者のCryptoZombiesまとめ(中級編チャプター3)

2022/08/26に公開

はじめに

前回のチャプター

チャプター3で学べること

コントラクトのセキュリティ関数やガス代の節約実装、for文など。

Ownable

  • 下の例のように、Ownableを継承することで、コントラクトを作った人しか実行できない関数を作ることができる
  • OpenZeppelinというライブラリに存在する
import "openzeppelin-contracts/contracts/access/Ownable.sol";
contract ZombieFactory is Ownable {
}

関数修飾子(modifier)

  • ある関数(またはメソッド)を実行する前に必ず実行しておきたい処理がある場合に使用する
  • 関数定義の最後に修飾子の名前をつけることで、宣言した関数が動く前に関数修飾子で宣言した関数を実行する
// 変数がない場合の関数修飾子
modifier onlyOwner() {
  require(msg.sender == owner);
  // _;ステートメントにたどり着いた時に、likeABossに戻ってコードを実行するようになっている
  _;
}
contract MyContract is Ownable {
  event LaughManiacally(string laughter);
  // likeABossを呼び出すと onlyOwnerの中のコードが最初に実行される
  function likeABoss() external onlyOwner {
    LaughManiacally("Muahahahaha");
  }
}

// 変数がある場合の関数修飾子
mapping (uint => uint) public age;
modifier olderThan(uint _age, uint _userId) {
  require (age[_userId] >= _age);
  _;
}
function driveCar(uint _userId) public olderThan(16, _userId) {
}

時間や日時について

  • Solidityには seconds、 minutes、 hours、 days、weeks 、yearsという単位がある
uint lastUpdated;

// lastUpdatedにnowを設定する
function updateTimestamp() public {
  lastUpdated = now;
}

// updateTimestampが呼ばれてから5分経っていれば、true
function fiveMinutesHavePassed() public view returns (bool) {
  return (now >= (lastUpdated + 5 minutes));
}

View関数

  • データを参照するだけの関数。そのため、view関数を外部から呼び出しても、ガス代がかからない
  • トランザクションを生成する必要がないことをフロント側(web3.js)に伝えられる
function getZombiesByOwner(address _owner) external view returns(uint[]) {
}

for文

function getEvens() pure external returns(uint[]) {
  uint[] memory evens = new uint[](5);
  uint counter = 0;
  for (uint i = 1; i <= 10; i++) {
    // iが偶数ならの場合
    if (i % 2 == 0) {
      // 配列に格納する
      evens[counter] = i;
      // カウンタ増加
      counter++;
    }
  }
  // [2, 4, 6, 8, 10]が返却される
  return evens;
}

チャプター3のまとめ

このチャプターでは、コントラクトのセキュリティとガス代を考慮した実装を学ぶことができた。
特にview関数に関しては、ガス代節約のために、積極的に使っていく必要があるため、理解を深める必要があると感じた。

Discussion