CryptoZombiesにSolidityを学ぶ Lesson.3 (chapter.5まで)
スマートコントラクトを構築するための言語solidity
言語をブラウザで遊びながら学ぶCryptoZombie
前回でLesson2を終えた。
今回はLesson.3をやっていきます。
目次
- ガイドライン
- Lesson.3 Chapter.1
- Lesson.3 Chapter.2
- Lesson.3 Chapter.3
- Lesson.3 Chapter.4
- Lesson.3 Chapter.5
ガイドライン
- コントラクトのオーナーシップ
- ガス代
- コードの最適化
- セキュリティ
といった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));
}
-----
今日はここまで。
続く