algonote

There's More Than One Way To Do It

CryptoZombiesでSolidityを学ぶ

CryptoZombiesを受講しました。

CryptoZombiesとは

CryptoZombiesはLoom Networkが制作したSolidityの学習サイト。学習といっても講義資料が並んでいるというよりはゲームを通して学ぶ形式。同じゾンビものでいうとRAILS FOR ZOMBIESがすでにあり、多分に影響を受けていると思われる。

ソースはgithub上にホストされており、元はもちろん英語だがプロジェクトがローカライズに力を入れているため日本語でも受講できる(数日前に最後の6章が和訳された)。

全体の構成

基本はSolidityというJavaScriptに似たスマートコントラクトをかくためのDSLでDAppsゲームを作りながら学んでいく。ゲームはタイトル通り、ゾンビを合成、捕食することができるごく単純なカードゲームのようなもの。

  • ゾンビファクトリーの作成
    Solidityの文法の基礎。
    演算子、型、配列、関数、構造体、public/private、ファイル行頭のおまじないの書き方など。

  • ゾンビが人間を襲う
    Solidityの基礎その2。
    if文、別のコントラクトとのやりとり、interface、複数の戻り値、アドレス、マッピング、internal/external

  • Solidityの高度なコンセプト
    プログラムを書く上での勘所。
    所有権、ガス、メモリー、ストレージ、関数修飾子、時間、View関数、forループ

  • ゾンビのバトルシステム
    プレイヤーからの金銭の受け取り方
    乱数生成、payable修飾詞、transfer

  • ERC721とクリプト収集物
    規格の解説。
    ERC20トークン、ERC721トークン、規格に沿ったプログラムにリファクタリング、SafeMathでオーバーフロー/アンダーフローを回避

  • アプリのフロントエンドとWeb3.js
    JavaScriptでDAppを呼び出す方法
    Web3.js、Infura、Metamask、コントラクトABI、Call, Send、Wei、indexed

以下所感

稼働保証されているWeb APIと課金がセットになっている新しい体験

今回、やっていてみて一番驚いたのはSolidityでpublicに書いたものは他のプログラムからもアクセスできるということだった。

通常のプログラムでいうとpublicといってもそれは自分の実行環境の中での話であり、DLLのように意図してビルドしないと他者は利用できないことが多い。Web APIでもわざわざサーバーを立てなければアクセスすることができない。

プログラムが例えオープンソースになっていてもその環境構築や実行をするのはSoftware Engineerの仕事であり、どうしてもインフラが必要。

DAppsというのは言ってしまえばブロックチェーンというp2pプログラムによってほぼ永続的に稼働することが担保された仮想マシン上で動くプログラムであり、そこにプログラムをデプロイするとういことはServerless環境にgit pushする感覚に近いことがわかった。

実際、今回製作したプログラムでもゾンビにCryptoKittiesを補食させており、APIの仕様が公開されており、それが動いていることが保証されてかつ、課金APIも同梱されているという体験は新鮮だった。

SolidityはJavaScriptの皮をかぶったC言語だった

一方で、Ethereumという実行環境上の制限も目立った。

コースではストレージにデータを保存する行為が高コストであることを繰り返し強調していた。ブロックチェーンという仕組み上仕方がないが、世界中に何万台もあるコンピュータにわざわざ完璧に同じデータを保存するというエコのど反対、無駄の極地であり、それゆえの制限がつらく思えた。

コースでも32ビットあるuint型を可能な限り、8ビットの型にしてそれを構造体に押し込めるということをしている。以前30~40年前に書かれたCの最適化の本とほぼ同内容であり、SolidityはJavaScriptの皮をかぶったC言語だったというのが個人的な感想。

人類、今さらこのレイヤーのことを手動でやらないといけないの? Solidity以外のDapp用言語だと違うんだろうか...

ブロックチェーンに保存すれば永続的に消えないのまやかし

また、コースではすでにデプロイ済みのコントラクトを書き換えるための仕組みも紹介されていた。

一度デプロイしたコードは当然書き換えられないが、作法的には”このIDのコントラクトみてね"のIDをオーナーが書き換えることができる仕組みがあり、結局変更できると同等な気がした。

"ブロックチェーンに保存すれば永続的に消えない"といってもそれは String型が不変と同程度のものであり、ポインタを入れ替えれば実質書きかえられるというか。

最後に

何冊かスマートコントラクトの本を読んだが、CryptoZombiesはずば抜けてわかりやすく、よくできていた。

ICOというバグみたいな資金調達法故、"ブロックチェーンを使って"というピッチをよく聞くが、ガスのコストも考えて"それ本当にブロックチェーンじゃないとできないの?"と冷静に突っ込んでいきたい。