EGO-LOG

40代2児の父。主にプログラム学習と開発、仮想通貨、メタバース、たまに関係ないことを綴る。

CryptoZombiesにSolidityを学ぶ Lesson.3 (chapter.5まで)

スマートコントラクトを構築するための言語solidity

言語をブラウザで遊びながら学ぶCryptoZombie

 

前回でLesson2を終えた。

 

tenomeuonome.hateblo.jp

 

今回はLesson.3をやっていきます。

 

目次

 

ガイドライン

  • コントラクトのオーナーシップ
  • ガス代
  • コードの最適化
  • セキュリティ

といったDAPPを開発するのに必要な技術を身につけられるんだそう。

 


Lesson.3 Chapter.1 

コントラクトの不変性を学ぶ。

 

イミュータブル

コントラクトをイーサリアム上にデプロイすると、イミュータブルになる。

編集も更新もできなくなる。

 

外部依存関係

コントラクトのアドレスはハードコードせず関数から取得・設定する。

 

 


Lesson.3 Chapter.2 

Ownableコントラクトを学ぶ。

コントラクトをOwnable(所有可能)とすることで、コントラクトに特別な権限を持つオーナー(所有者)がいることを意味する。

 

OpenZeppelinのOwnableコントラクト

OpenZeppelinはSolidityのライブラリにあり、安全で検証を経たスマートコントラクトで、Dappで使用可能。

-----

contract Ownable {

  address public owner;

  event OwnershipTransferred( address indexed previousOwner, address indexed newOwner);

  // コンストラク

  function Ownable() public {

    owner = msg.sender;

  }

  // ownerだけが関数を実行できる

  modifier onlyOwner() {

    require(msg.sender == owner);

    _;

  }

 

  function transferOwnership(address newOwner) public onlyOwner {

    require(newOwner != address(0));

    OwnershipTransferred(owner, newOwner);

    owner = newOwner;

  }

}

-----

 

 


Lesson.3 Chapter.3 

onlyOwner関数の修飾子を学ぶ。

関数修飾子

function の代わりに modifierを使う。

関数のように直接呼び出すことはできない。

-----

// 関数修飾子の定義

modifier onlyOwner() {

  require(msg.sender == owner);

  _;

}

// 関数修飾子を使用する

contract MyContract is Ownable {

  event LaughManiacally( string laughter);

  // ↓onlyOwnerの中のコードが最初に実行。 _;ステートメントで関数に処理が戻る

  function likeABoss() external onlyOwner {

    LaughManiacally("Muahahhaha");

  }

}

-----

 

 


Lesson.3 Chapter.4

ガス(燃料)について学ぶ。

ガス-イーサリアムDAppの燃料

Solidityではユーザが関数を実行するたびにガスと呼ばれる通貨を支払う。

ガスの量は関数のロジックの複雑さによる。

ガスを節約するためのstruct構造

structの中の変数のみ、できるだけ小さい単位のuintを使うことでストレージを小さくすることが可能。

-----

struct NormalStruct {

  uint a;

  uint b;

  uint c;

}

 

struct MinMe {

  uint32 a;

  uint32 b;

  uint32 c;

}

-----

NormalStructではuint(256ビット)のためコストが高い。

 


Lesson.3 Chapter.5

時間の単位 を学ぶ。

now・・・現在のunixタイムスタンプ

seconds, minutes, hours, days, weeks, yearsなどがある。

-----

uint lastUpdated;

// ↓現在日時を保持

function updateTimestamp() public {

  lastUpdated = now;

}

// ↓五分経過していればtrue

function fiveMinutesHavePassed() public view returns (bool) {

  return (now >= (lastUpdated + 5 minutes));

}

-----

 

今日はここまで。

 

続く