概要
Ethereumを始めとして、スマートコントラクトを作成できる環境がどんどん整いつつ有るように感じる最近です。
ですが手軽にできるようになってきたからこそ、忘れてはいけないのがセキュリティ対策ですね。
この記事では、スマートコントラクトのセキュリティをゲーム形式で楽しく学べる"Capture the Ether"の紹介をさせていただきます。
スマートコントラクトのセキュリティ
スマートコントラクトのセキュリティの重要性
皆様ご存知の通りだと思いますが、ざっくりおさらいさせていただきます。
- 一度リリース(=デプロイ)したら修正がとても難しい
- 修正どころか、強制停止も難しい
- しかし、扱えるお金は非常に大きい
こういった特性から、リリース前にセキュリティ対策がきちんと出来ているかをチェックすることが非常に重要なのです。
ならどうやって対策すればいいの?
とはいえども、まだまだ新しい分野のため、セキュリティの専門家はごくわずか。
専門の書籍も少なく、情報も増えては来ていますが、中々ハードルは高い印象です。
そこで、参加した勉強会で紹介していただいた、簡単に楽しくスマートコントラクトを学べる"Capture the Ether"が割と良さそうだったので共有させていただきます。
Capture the Ether とは
公式より
公式の説明をざっくり意訳させていただきます(訳が怪しいのはお許しください)。
Capture the Ether って?
Capture the Etherはセキュリティを学ぶために、Ethereum のスマートコントラクトをハッキングするゲームだ。
楽しみながら勉強できるよ!
このゲームはスマートコントラクトに関するブログ、Program the Blockchainの管理人でも有る@smarxの提供だ。
ルールは?どうやったら勝ち?
ゲームは、いろいろなカテゴリの一連の課題で構成されているよ。各課題をクリアするごとにポイントを獲得できる。より難しいものほど、多くのポイントがゲットできるようになっているんだ!
さて、各課題は、isComplete関数(または、public state変数)が用意されたスマートコントラクトの形式で用意されている。君の目的は、isComplete関数の返り値がtrueになるようにスマートコントラクトをハックすることだ!
課題をクリアしてポイントを集めるとどうなるか?リーダーボードに君の名前が載ることになるだろう!
何から始めたらいい?
warmup(準備運動)は君が必要になるであろうツールの紹介のためのカテゴリだ。でも、もし君が最新のEthereumのスマートコントラクトを開発しようと考えているならば、最初にProgram the Blockchainと、そのバックグラウンドに目を通しておいてほしい。
つまり?
脆弱性の有るスマートコントラクトを実際にハッキングする経験を通して、バッドプラクティスを知り、セキュリティ対策を学ぶことができるゲームです。
ポイントを稼いでリーダーボード上位を目指せ!
もしSolidityの文法を学んだことがないなら、先にCryptoZombiesがおすすめです。
実際に挑戦してみよう
準備するもの
公式でも推奨の環境は有るのですが、私が個人的に使用している環境を紹介します。
-
Remix
- SolidityのWebIDE。これで開発からデプロイまで。
- 紹介ページはココらへんを参照のこと。
-
MetaMask
- Chrome/Firefox用のウォレット管理プラグイン。
- 実行にはEthereumのテストネットを使用するので、MetaMaskがあると便利。
- 紹介ページはココらへんを参照のこと。
- RopstenのEthereum残高
- 実行時に少なからずEtherが必要。準備しておきます。
- ※テストネットのものなので無料で用意できます。
- ココらへんを参考に5~10Etherを用意しておくと安心。
進め方
ここではWarmupの課題を2つ、実際の進め方を解説して、基本的な課題の進め方を説明したいと思います。
まずはトップの【LET'S PLAY >】から。
Deploy a contract
公式を意訳しつつ画像等で補足します。
このチャレンジをコンプリートするための手順は以下のとおり。
- MetaMaskをインストールしよう
- RopStenテストネットワークに切り替えよう
- RopStenのテスト用Etherを手に入れよう。"buy"ボタンを押すと、テスト用Etherを配布しているfaucetのページに飛ぶはずだ。
(ここまでは上の【準備するもの】を参考にしていただければ。)
クリックすると、MetaMaskが実行されるので、【Submit】を選択。
今回は、デプロイしたコントラクトに対して何もする必要はない。デプロイが終わったら、左のボタンが変わるから、"Check Solution"ボタンを押せば完了だ!
デプロイが終わると以下のような画面に。
【Check Solution】を押す。
クリックすると、またMetaMaskが実行されるので、【Submit】を選択。
これで終了。MetaMaskのトランザクションが実際に取り込まれるまでにやや時間がかかることには注意。
Call me
同じく。
このチャレンジをコンプリオートするためには、たった一つの関数を呼び出すだけでいい。
"Begin Challenge"ボタンで、以下のコントラクトがデプロイされる。
pragma solidity ^0.4.21; contract CallMeChallenge { bool public isComplete = false; function callme() public { isComplete = true; } }
callme()関数を呼び出せたら、"Check Solution"ボタンをクリックしてくれ。
…とは言われてもどういうこと?という感じかもしれないので進め方を以下に解説。
(1)まずは"Begin Challenge"を押します。MetaMaskでの実行も忘れずに。これによって、先のコードがRopSten上にデプロイされます(画像は使いまわし)。
(2)デプロイが完了すると、コントラクトのアドレスが表示されるので、それをメモ帳などにコピーしておきます(画像は使いまわし)。
(3)Remixに移動して、先のコントラクトのコードを全部貼り付け、【Start to Compile】を押します
下の方に緑背景で「CallMeChallenge」が出ればOK。
(4)【Run】タブを選択して、【Environment】を"Injected Web3"にする
(5)先ほどコピーしておいたコントラクトアドレスを【At Address】に貼り付けて、【At Address】をクリック
)
(6)これで、先にデプロイしておいたコントラクトが操作できるようになったので、【callme】ボタンを押して、callme()メソッドを呼び出す(※この時、MetaMaskの処理がまた必要)
(7)これでコンプリート条件を満たしたので、【CheckSolution】をクリック(画像は使いまわし)
これで完了です。
まとめ
今回解説したのはチュートリアルでしたが、同様に勧めていくことでスマートコントラクトのセキュリティについて学んでいくことが出来ます。基本的な流れは「デプロイ→ハック(今回解説した、メソッドの実行と同じような形で行えるはず)→コンプリート」です。
バッドプラクティスと、それに対する攻撃方法を知ることは、防御方法を知る近道だと思います。手を動かしてそれを学べるこのサービスは中々有用ではないでしょうか。
また、逆にベストプラクティスを学びたいならZeppelinあたりが有名所でしょうか。
もしおすすめがあればコメントいただけると嬉しいです。