EGO-LOG

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

CryptoZombiesにSolidityを学ぶ Lesson.3 (完)

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

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

 

前回はLesson.3 Chapter.5まで。

tenomeuonome.hateblo.jp

 

続きやっていきます。

 

目次

 

Lesson.3 Chapter.6 

structを引数として渡す

structへのstorageポインタは、privateやinternal関数の引数として渡せる。

-----

function _doStuff(Zombie storage _zombie) internal {

  //

}

-----

 

Lesson.3 Chapter.7 

Public関数とセキュリティを学ぶ。

public関数は外から呼べて好きな引数を渡せてしまうので危険

必要な場合を除きinternal関数にしましょうという内容。

 

Lesson.3 Chapter.8 

引数を持つ関数修飾子

-----

// ユーザの年齢を格納するマッピング

mapping ( uint => uint ) public age;

// ユーザーの年齢が一定の年齢より高いことを要件とする関数修飾子

modifier olderThan(uint _age, uint _userId) {

  require( age[_userId] => _age);

  _;

}

// 18才以上の場合のみ関数を実行する

function driverCar(uint _userId) public olderThan(18, _userId) {

  //

}

-----

 

Lesson.3 Chapter.9 

省略

 

Lesson.3 Chapter.10 

view関数でガスを節約

view関数を外部から呼び出す場合はガス代が発生しない。

view関数であればブロックチェーン上で何も変更しないため。

ただし、view関数が同じコントラクトのviewでない関数から呼び出される場合はコストが発生する。

view関数は外部から呼び出す場合のみコストが発生しない。

 

Lesson.3 Chapter.11 

storageへの書き込みはコストが高く、ガス代もかかる。

これを抑えるために、絶対に必要な場合を除いてsotrageへの書き込みを行わないようにする。

storageに書き込まないために、memory上に配列を再構築するなど、大きなデータセットをループした方が低コストになる。

memory内で配列を宣言する

-----

function getArray() external pure returns( uint ) {

  // 長さ3の新しい配列をメモリ内にインスタンス化する

  uint memory values = new uint(3);

  // 値を追加

  values.push(1);

  values.push(2);

  values.push(3);

  //配列を返す

  return values;

}

 

Lesson.3 Chapter.12 

Forループ

storageの配列から1要素を取り出そうとした場合、以下の手順になる。

  • 要素を新しいオーナーの配列に追加する
  • 元のオーナーの配列から要素を削除する
  • 元のオーナーの配列の番号を変更する
  • 配列の長さを1減らす

ステップが多く、ガスコストが非常に高額になる。

view関数は外部から呼び出した際にガスコストが発生しない。

-----

function getEvens() pure external returns(uint) {

  uint memory evens = new uint(5);

  // 新しい配列のインデックスをトラックする

  uint counter = 0;

  //1から10までループ

  for( uint i=1; i<= 10; i++){

    if( i % 2 == 0){

      // 偶数の場合配列に格納

      evens[counter] = i;

      counter++;

    }

  }

return evens;

}

-----

 

 

これでLesson3終了。

主にガスコストについて学べたと思う。

 

次回はLesson4へ。

 

続く