はじめに
普段はWEBアプリやスマホアプリなんかを作っているんですが、
去年ビットコインを購入して以来ブロックチェーンをちょこちょこと調べるようになりました。
もともと自分で思いついたアイデアを元にアプリを作るのが好きなので、
DappsのプラットフォームであるEthereumを使って何か作ってみることにしました。
つくったもの
地震保険アプリ「Etherequake」
https://etherquake.herokuapp.com/
※Webインターフェースの利用にはMetamask必須
これはなに?
Ethereumのスマートコントラクトを使った地震保険です。
地震保険、というか、まあ、ギャンブルです。
現在EthereumのTest net (Ropsten)上で動いています。
流れとしては下記のようになっています。
- 1ヶ月単位で参加者の募集と払い戻しをする
- ユーザはコントラクトに掛け金(ether)を送金し、同時に位置情報も送信する
- 対象の期間が終了する
- インターネットから対象期間に発生した地震情報を取得する
- マグニチュード6以上の地震が半径100km圏内で起きたユーザに対して、対象ラウンドに集まっている全Etherの90%を配分する
苦労したこと
Solidityが辛い
EthereumのスマートコントラクトはSolidityという独自言語で開発します。
このSoidityが絶賛開発中の段階なのでいろいろと足りていない(気がする)。
特に今回は位置情報から地球上の2点間の距離を計算する時に、「小数点を扱う型が無い」というのがつらかったです。
計算式にサインやコサインが入るため、円を16384に分割し、サインとコサインを-32767 から 32767の数値で近似する方法
を使用して近似計算をしました。
日本語の情報が少ない
これはなんでもそうなんですが、新しい技術の情報は基本英語です。
これはもう仕方ないですね。
課題
Ethereumの外部から中央集権的に情報を取得している
地震の情報が必要なので、ブロックチェーンの外部からOraclizeを通して地震情報を取得しています。
Augerなどの未来予測プラットフォームではこの外部から持ってきた情報をトークン保有者の投票によって正しいか正しくないかを決める方法があるらしいです。
このアプリでは情報を一方的に正しいものとしているので中央集権的です。
定期的なメソッドの呼び出しが出来ない
これは方法が確立されているのかもしれませんが、
ある期間が終わった時に自動的に地震情報を取得する、ということが出来ていません。
なのでラウンドが終わったあとに人力で地震情報を取得するためにコントラクトのメソッドをコールしたければいけません。
これはイケてない。
Gas(トランザクションコスト)が高い
なかなか面倒な処理をしているため、Gasが結構高くなります。
位置情報の偽装
当たり前ですが位置情報は偽装できます。さらに、一応Webにインターフェースを設けていますが、
もちろん直接コントラクトに位置情報を送ることもできるので、ユーザが送った位置情報=ユーザのいる場所ではありません。
任意の位置情報を送信できるとなると、断層周辺など地震が起こる確率が高い場所にベットすることもできます。
こうなるとオッズなどの概念を入れる必要が出てきたり、ますますただのギャンブル感がでてきます。。。
法律の問題
まあ、ギャンブルなので法律的にアウトでしょう。
コントラクトだけMain netに上げるのはありなの??
おわりに
課題も多いですがこんな感じでなんとか人生初のDappをデプロイできました。
追々コードや使用したライブラリなどについてもう少し詳しく書くかもしれません。
付録
ちなみに、 テックアカデミーがブロックチェーンを学べる「スマートコントラクトコース」を開始しているようなので気になっています。
今回疑問点も多く出たのでパーソナルメンターが付くとか羨ましいです。
スマートコントラクト開発は最初この本で勉強しました。