※本記事はQiita @ku_suke さんの記事の転載です。
- TL;DR
- なんで作ろうと思ったか
- そもそもブロックチェーンを使ったサービスとは
- 何ができるの?
- ダッチオークション方式による売り出し
- Bancorによるマーケットプレイスの実装
- なんでこんなややこしい事しているの?
TL;DR
ブロックチェーンで人をカード化して売買できるサービスを作りました。何を言っているかわからないと思うので詳しくはこれを見てほしい。割とあまり事例のないことをやってきて苦労しまくったので、これからブロックチェーンプロジェクトを始める人の役に立てればと思って記事にまとめました。
Financie(フィナンシェと読みます)というサービスです。
※僕は代表して記事を書いているけど実際は10人くらいのエンジニアチームを含む30人くらいのスタートアップにしては大所帯のチーム。ブロックチェーン周りの設計とかCTOは@rudoさん。
なんで作ろうと思ったか
さかのぼること1年くらい前、「仮想通貨は落ち込んでるけどブロックチェーンはきっと伸びるに違いない、ここで面白いことやろうよ!」といっていろんな案を考えた末、行きついたのがこのサービスでした。ブロックチェーンによる価値の民主化、分散、個人の時代、そんなキーワードを抱えながら、僕たちは始まりました。
もちろんその当時似たようなサービスではVALUもTimebankも海外ではPatreonもすでに世の中に出ていました。でも僕たちはもっと、有名人じゃなくても普通の人がかなえたい夢を応援するような、そんなサービスを考えていました。
その後大変な紆余曲折を経て今に至るのですが、Qiitaなので技術的な側面についてかきます。
そもそもブロックチェーンを使ったサービスとは
ブロックチェーン上に構築されるサービスをざっくりDAppsといいます。DApp(s)とは分散型アプリのことですが、実はそのほとんどは、ブロックチェーンのコード量よりもそれ以外のAWSとかGCPにのっかってるコードやリソースの量が多いのです。
なぜなら2019年前半の現在、一番メジャーなプラットフォームであるEthereumを含め、ほとんどの分散アプリケーション実行環境は大量のアクセスを実行したり、画像をホスティングするには不向きな構造になっているからです。
Financieではさらに、ブロックチェーンへのアクセスをユーザーから直接ではなくサーバ側から呼び出すように変更しました。そのため表側のアプリケーションはごく普通のRailsで書かれていて、価値を記録する部分であるカードの売り買い部分だけRailsからJSON-RPCを通じてEthereum上にデプロイした自前のコントラクトをたたいています。 普通は、ブラウザ拡張のMetaMaskやモバイルウォレット(TokenPocketやGo! WALLET)を使ってアクセスするのですが、より多くの方に参加してもらうためユーザー側に特別なソフトウエアが不要な設計にしました。
何ができるの?
Financieは「ヒーロー」と呼ばれる夢を持って頑張る人のカードを購入することができます。購入したカードの価値はブロックチェーン(Ethereum)上に記録され、同じくEthereum上で自律的に動くマーケットプレイスを通じていつでも売り買いすることができます。
クラウドファンディングのように単発の支援ではなく、オンラインサロンとも違い、ファンはヒーローを応援することで自分が買ったトレカの価値が向上するといった仕組みを中心に、ヒーローとともに成長できる世界ができたらおもしろいんじゃないかとチャレンジしています。
ちなみに、Ethereum上のトークンはいくつか規格があって、有名どころだとMyCryptoHeroesとかCryptoKittiesとかは、ERC721と呼ばれる、NonFunsibleTokenで実装されることが多いです。しかし、Financieでは普通のトークンというか、ERC20で実装しています。これはERC721が唯一性を実現している(ようは1枚1枚別の価値を持つ。)のと異なり、ヒーローカードは同じヒーローであれば1枚の価値は等しいからです。
ただしシンプルにERC20トークンでサービスを実装すると2号仮想通貨の該当性が論点に当たる可能性があるので注意。そのあたりもどこかで書きます。
ダッチオークション方式による売り出し
Financieのカード販売は2つの方法があります。一定期間入札を受け付ける「売り出し」と、いつでもカードを売買できる「マーケットプレイス」です。どちらもSolidityによるスマートコントラクトで実装されていて、実行結果は各種ブロックチェーンエクスプローラで確認することができます。
売り出しに関してはダッチオークション方式を採用しました。これは発売当初はものすごく単価が高いところからスタートして、徐々に単価が下がっていく方式です。最終的に募集総額まで集まった段階で購入単価が決定し、全員同じ単価で、入札金額に応じたカード枚数が付与される仕組みとなっています。
文字だけで説明するとわかりにくいので図で表すとこんな感じ
この図でいうと、全員が1枚当たり単価30円でカードを購入することができます。さらに時間が過ぎると0.1円とかになります。100万枚が0.1円で募集終了すると、総額10万円分のカードが販売されることになります。
この仕組みの何がうれしいかというと、Financieはあくまでヒーローの夢を応援したいので、お金持ちが大量に買い占めて人々にいきわたらないことをある程度防ぐ目的があります。もし買い占めたければ、3倍以上の単価で入札する必要があるため、より多くのファンにカードを少しでも手にしてもらいやすくなることを意図しています。
ダッチオークションの実装はRaidenのクラウドセールを参考にしました。@m0t0k1ch1さんの記事が分かりやすい。
Bancorによるマーケットプレイスの実装
次に、購入したカードの売買については、Bancorと呼ばれる仕組みを採用しています。同名のプロジェクトでもDEX(分散型取引所)が運営されているけど、彼らのSolidity実装を取り込んで今回の要件に合う形に作らせてもらいました。
Bancorの良いところは、いつでもおおむね無条件に売り買いできることです。スマートコントラクトを自販機のメタファーで解説することがありますが、Bancorはまさに自販機です。売る人が多ければ単価が下がり、買う人が多ければ単価が上がる自動ロジックのおかげで、買いたくても買えない、売りたくても売れないという流動性問題をある程度解消することができます。
特に、超有名人でもない限り、毎日毎日注目を浴び続けるわけはなく、そのような状態ではカードを売りたくても買ってくれる人が見つからなかったり、その逆も容易に起こりえます。これを解消するためにBancorによるマーケットプレイスを開発しました。
FinancieにおけるBancorの利用はちょっと特殊で、普通はネイティブトークンと呼ばれるETHとなにかを交換することが多いのですが、今回は都合でJPYとペッグした内部トークンとBancorのスマートトークン、スマートトークンとヒーローカードを2回交換しています(数式上は1回の場合と挙動が変わらない)
なんでこんなややこしい事しているの?
手段の目的化は楽しい! いろいろ突っ込みどころはあるかもしれないけど、ヒーローとファンが持続的な関係性を築いていけるようなコミュニティを作りたいと思っています。だから投機の場にならないような設計(審査や手数料も含めて)や、コミュニティのスコア化などなどの運用を設計しました。
お金だけじゃだめだし、ファンあるいはヒーローが疲弊していくような焼き畑コミュニティにならないよう、とても難しいチャレンジをテクノロジーの力でやり遂げたいと思っています。
こんな大変だけどチャレンジングなサービスを一緒に作っていきたい人がいれば全力でお待ちしております。
次回はなぜ日本円決済にしたのか、UI面や法律周りの話も書こうと思います。
追記:2本目はこちら EthereumのDApps開発で、開発サーバを転々としたまとめ(geth, Ganache, Ropsten, getho.io)