【Solidity 超入門】CryptoZombiesを通してdAppを作る 【part1】
Block Chainを勉強しようと志す人はスマートコントラクトの実装を避けては通れないと思います。solidityというプログラミング言語でスマートコントラクトを書くのがデファクトスタンダードですので、まずsolidiyを学習することになると思います。
solidityを学習しようと思い、ググってみると大体「CryptoZombies」なるサービスを推している人や記事が多くヒットします。ですが実際にサイトを見ると英語やん...日本語もあまりちゃんと翻訳されないし、取っ付きづらいと思われる方も多いと思います。今回はCryptoZombiesの取っ付きづらさをこの記事で可能な限り払拭でき、solidity学習で躓いていた方の助けになればと思います。
対象読者
Javascript等の他の言語でのプログラミングの経験がある方。
ですが、そこまで文法的には難しくないのでわからない用語があれば都度ググっていただければ読み進めることはできると思います。
CryptoZombiesとは??
CryptoZombiesは、暗号からゾンビを生み出すゲームの開発を通じて、Solidityでスマートコントラクトの構築を学習できる、インタラクティブなオンラインレッスンです。
CryptoZombiesではSolidityの基礎文法や知識、dAppsの開発方法をそれぞれのカリキュラムに沿って学習することで習得できます。後述するカリキュラムを通して実装していくとaAppのゲームが作れるよ!といったものです。
それぞれ5つのカリキュラムがあり、
- Solidity: Smart Contractの初級から中級を学ぶ
- Chain Link: 分散型オラクルを学ぶ
- 高度な Solidity: Smart Contractの深い知識の習得
- Beyond Ethereum: Blockchain Ecosystemの探求
- Tron: public block chanの一つであるTronへのdeployを学ぶ
が用意されています。本記事では最初の「Solidity: Smart Contractの初級から中級を学ぶ」について執筆しています。
ref: https://cryptozombies.io/en/course
学習内容
「Solidity: Smart Contractの初級から中級を学ぶ」のセクションでの学習内容を先にピックアップしておきます。
-
Making the Zombie Factory
-
Zombies Attack Their Victims
-
Advanced Solidity Concepts
-
Zombie Battle System
-
ERC721 & Crypto-Collectibles
-
App Front-ends & Web3.js
では本記事では「Making the Zombie Factory」について書いていきたいと思います。
Making the Zombie Factory
ゾンビ兵士の工場を作りながら、solidityの基礎を学んでいきます。最終的に名前を受け取り、それを使ってランダムなゾンビの兵士を生成し、ブロックチェーン上のアプリのゾンビデータベースに生成したゾンビを追加する関数が完成します。
Chapter1
CryptoZombiesで作ることのできるゲームはゾンビの兵士のデータを作成し、作成したゾンビの兵士同士で戦わせるといったものになります。なのでゾンビの兵士を作るところからです。まずゾンビの外見は16桁の整数のゾンビDNAで決まり、この数値が変わることで見た目が変わるという仕様になっているみたいです。(仕様なので深くこの辺は考えなくていいです)適当にスライダーをいじって次にいきましょう。
Chapter2
Contract
Solidityのコードはコントラクト内にカプセル化されています。ContractはETHアプリケーションの基本ブロックのことです。変数やファンクションはすべてContractに属しています。[1]
HelloWorldという名前の空のContractは
contract HelloWorld {
}
と書けます。
Version pragma
Solidityのソースコードは全て"version pragma"を先頭に書いておく必要があります。コードが使用するSolidityのコンパイラのバージョンを宣言です。将来コンパイラのバージョンが原因でコードが壊れることを防ぐために必要な記述なので必ず書く必要があります。
実際には
pragma solidity ^0.5.2;
という風に宣言します。
これをまとめれば、コントラクトを開始するための骨組みが完成です。
pragma solidity ^0.4.19;
// jsでいうところのclassに似たもの
contract HelloWorld {
}
今回はversionの範囲指定がありますので、そちらに沿って書いてあげると良きです。
例えば、バージョンが 0.4.19以上で0.5.2 を含まないバージョンのみ適用可能な場合、
pragma solidity >=0.4.19 <0.5.2
と書けます。
※ 因みにsolidityコードをコンパイルした際に出るSPDX-Licenseのwarningが出ることがありますが、これについては以下の記事が詳しいです。
Chapter2の答え
pragma solidity >=0.5.0 <0.6.0;
contract ZombieFactory {
}
となります。
Chapter3
状態変数と整数についてのチャプターです。
状態変数
Contract内に永続的に保管され続けるものです。要するにETHブロックチェーン上に乗るということです。データベースに書き込むようなものですが、これは書き方を間違えると永遠にチェーンに刻まれてしまうので扱いには注意が必要です。
以下は、myUnsignedInteger
という名前のuint
を作り、値を100に設定する例です。
contract Example {
// この部分がブロックチェーン上に記載される
uint myUnsignedInteger = 100;
}
符号なし整数: uint
uintというのは、符号なし整数のデータ型です。これは負数ではないということを示しており、他にintという符号付整数もあります。[2]
Chpter3の答え
ゾンビ兵士のDNAは、16桁の数字で決定されることになります。dnaDigits
という名前のuint
を宣言し、16に等しく設定しましょうということなので以下になります。
pragma solidity >=0.5.0 <0.6.0;
contract ZombieFactory {
uint dnaDigits = 16;
}
Chapter4
数式演算
Solidityで使う数式演算についての章です。jsや他の言語との違いはあまりないので特に気をつけるべき点はありません。
// 加算(足し算):
x + y
//減算(引き算):
x - y
//乗算(掛け算):
x * y
//除算(割り算):
x / y
//剰余(余り):
x % y
//Solidityは指数演算子もサポートしている。例 "xのy乗"だと
x ** y
Chapter4の答え
ゾンビのDNAが16桁の数字だと確認するために、別のuintを作成して10^16と設定します。(※後のレクチャーでは剰余演算子である %を使用して整数を16桁に縮小できる。)
dnaModulus
という名前のuint
を作成し、10のdnaDigits
乗に設定しなさいとのことnので答えは、
pragma solidity >=0.5.0 <0.6.0;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
}
となります。
part1の最後に
お疲れ様でした。今回はChapter1~4までをまとめてみました。なるべく「Making the Zombie Factory」は1記事にまとめたかったですが、分量が多くなりそうなのでpart分けしております。近日中にprt2も公開できればと思います。
References
no plan株式会社について
- no plan株式会社は、ブロックチェーン技術、Webサイト開発、ネイティブアプリ開発、チーム育成、などWebサービス全般の開発から運用や教育、支援などを行っています。よくわからない、ふわふわしたノープラン状態でも大丈夫!ご一緒にプランを立てていきましょう!
- no plan株式会社について
- no plan株式会社 | ブロックチェーン実績
- no plan株式会社 | ブログ一覧
-
Solidityに置けるコントラクトはオブジェクト指向の言語におけるクラスに似ています。コントラクトは永続的な状態変数とそれを変更するファンクションを保持しています。異なるコントラクト上(インスタンス上)のファンクションコールはEVMのファンクションコールとなり、その結果コンテクストが変わり、状態変数にアクセスできなくなります。コントラクトとそのファンクションは呼び出さないと動きません。Ethereumには"cron"の様に特定のイベントで自動的にファンクションを呼び出す機能はありません。 ↩︎
-
Solidityでは、uintは256ビットの符号なし整数であるuint256のエイリアスです。 uint8、uint16、 uint32など、少ないビット数でuintを宣言することもできます。しかし、一般的には特定の場合を除いて、単にuintを使います。 ↩︎
Discussion