CryptoZombiesにSolidityを学ぶ Lesson.3 (完)
スマートコントラクトを構築するための言語solidity
言語をブラウザで遊びながら学ぶCryptoZombie
前回はLesson.3 Chapter.5まで。
続きやっていきます。
目次
- Lesson.3 Chapter.6
- Lesson.3 Chapter.7
- Lesson.3 Chapter.8
- Lesson.3 Chapter.9
- Lesson.3 Chapter.10
- Lesson.3 Chapter.11
- Lesson.3 Chapter.12
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へ。
続く