こんにちは。ALIS CTOの石井(@sot528)です。
このブログはALISブロックチェーンブログとしてALISの技術的知見をアウトプットする場です。私達がブロックチェーンを用いたプロダクトを開発し、実運用してゆく中で得られた情報を書いてゆきます。
ブロックチェーンだけでなく、ブロックチェーンを絡めたシステム開発の生きた情報を提供できればと考えています。
第一回はALIS(https://alis.to)を構成するシステムの大枠をお伝えします。
目次:
・概要
・ブロックチェーン
・サーバサイド
・フロントエンド
・備考
2018年6月現在、ALISのシステムはどこを切り出しても比較的興味深い構成になっているかと思います。
国内でtoC向けに、FinTeck系以外のブロックチェーンベースのサービスを展開している数少ないプロジェクトであり、サーバサイドはフルサーバレス、フロントエンドはVue.js+Nuxt.jsを採用しています。そしてそのコードの大部分はGitHubで公開しています。
このような構成となった理由は、一つはこのプロジェクトのシステム面として面白いことをやろうという意図がありました。2017年9月に実施したミートアップで、私は以下の技術スタックについて発表しました。
ブロックチェーンにEthereumを使用することはこの時点で決定していました。その他についてはご覧の通り、比較的枯れた技術(React, Rails+Docker, MySQL)と、比較的先進的なアーキテクチャ(Vue.js, サーバレス, DynamoDB)を採用する選択肢の両方を検討していました。
結論としては、すべて尖った方に倒しました。それが実現可能であり、その方が楽しいからです。そしてエンジニアが楽しく開発できる環境は組織として大きなアドバンテージとなる。その意図もありました。また、尖りすぎて自己満足で終わるような選択肢ではない、とも考えています。
幸い、先進的なものを取り入れてゆこうというチームメンバーが揃ったことで上記構成を実現できました。さらにフロントエンドにはNuxt.jsも採用しSSRを行うなど、最終的にはよりモダンな構成に落ち着いています。新しい技術を使ったお金に関わるシステムを半年で出す、という割と無茶な挑戦も、まだまだβ版ですが何とか走り出すことができました。
各構成要素については別途、より詳細なエントリを書く予定です。今回はシステム概観ということで、ひとつずつざっと紹介いたします。
さきほど述べましたが、ALISではブロックチェーンにEthereumを採用しています。詳細は別エントリに譲りますが、いくつものプラットフォームをフラットに評価した結果、Ethereum以外のプラットフォームは選択し得ないと結論づけました。
ALISのトークンコントラクトについてはICO時点ですでにメインネットにデプロイしており、複数の取引所でやりとりされています。
以下はサービスのブロックチェーン部分について記載します。
じつはプロジェクト開始時点(2017年前半)では、ブロックチェーンに関わる機能はすべてEthereumメインネットにÐAppsとして構築しようと考えていました。
しかし2017年、Ethereumはプラットフォームとして躍進し、トランザクションが膨大に増えた結果としてそのスケーラビリティの課題が顕在化しました。
このあたりは、私がEthereumデベロッパコミュニティのHi-Etherのイベントでお話させていただいた以下のスライドで詳しく説明しています。
上記の課題に対して、ALISでは独自にEthereumのプライベートチェーンを立てることで対策を取りました。本来であればDecentralizedの担保という観点から望ましい打ち手ではありませんが、この過渡期における暫定的な処置としてこの打ち手となりました。
コンセンサス・アルゴリズムにはParity PoAを採用しています。ParityではParity Bridgeなど現時点での打開策となり得る取り組みが行われているためこの構成となりました。
しかし私達の想いとしては、やはりすべてトラストレスなシステムに寄せてゆきたいと考えています。今後メインネットでのCasperやSharding、レイヤー2でのPlasma等の進化を迅速にキャッチアップし、適切なタイミングで移行する予定です。
※追記:関連記事
ALISのサーバサイドの特徴は、すべてサーバレスであることです。上記のブロックチェーン運用部分のEC2を例外として、その他はすべてAWSのフルマネージドサービスを活用したコストパフォーマンスが良くスケーラブルな構成となっています。セキュアであり、可用性が高く、運用負荷が圧倒的に低く抑えられています。
詳細は別エントリに記載いたしますが、今回はブロックチェーンと絡めることで得られた知見を共有いたします。それは、ブロックチェーンとサーバレスアーキテクチャは相性が良いということです。
詳細をご説明します。
複数の理由により、上記アーキテクチャにRDBMSを採用するのはある種のアンチパターンとされています。
・参考: なぜAWS LambdaとRDBMSの相性が悪いかを簡単に説明する(@Keisuke69)
そのためALISではDynamoDBを採用しています。そのDynamoDBにはACID特性がありません。仕様上AtomicityとIsolationは担保されないのです。これは、いわゆるミッションクリティカルな領域には相性が悪いことを意味します。
ALISではトークンという金銭に準じる要素を取り扱います。これは言うまでもなくミッションクリティカルですが、その金銭にまつわるシステムに最も親和性の高い技術こそブロックチェーンなのです。
ALISのアーキテクチャでは現状、トークン周りのシステムとしての堅さが求められる部分にブロックチェーン、それ以外にサーバレスという比較的きれいな切り分けができているかと思います。
※追記:関連記事
フロントエンドはVue.js+Nuxt.jsを採用しています。Lambda上でSSR基盤としてNuxt.jsを動かし、サービス全体がSPAとして構築されています。
国内屈指のNuxt.js技術者@poteto4dさんにレビューしてもらいつつ実装したALISのフロントエンドは、これからVue.js+Nuxt.jsを学んでゆこうというエンジニアにとって良い実装例となるかと思います。
本来であればALISのブロックチェーン部分をメインネットに寄せ、フロントエンドでVue.jsとweb3.jsを駆使したよりブロックチェーン絡みの実装もできればと考えていたのですが、上記のEthereumのスケーリング問題との兼ね合いで今はペンディングとなっています(Lambda上でweb3.pyを動かすのもそれはそれで面白いのですが)。今後、タイミングを見てそのあたりもどんどん実装と知見の共有をしてゆけるかと思います。
余談ですが、LambdaでNode.js 8.10がサポートされたのは2018年4月2日であり、ALISのクローズドβリリースが2018年4月23日です。Nuxt.jsはEC2で運用するしかないかも、と覚悟していましたが、そろそろ来るだろうと予想していたLamdaによるNuxt.jsが使えるNode.js 8.10のサポートが来たので土壇場で載せ替えました。もしかしたらNuxt.jsをLambdaで本番運用した世界初のプロジェクトかもしれませんね。
今回はざっとALISのシステム概観を書きました。次回以降は個々の構成要素について深く掘り下げた内容を書いてゆければと思います。
ALISの開発チームには、良さそうなものはどんどん取り入れようという風土があります。なおかつ何でも新技術を使って自己満足するのではなく、きっちりコミュニティへの価値還元が大前提としてあり、サービスのグロースやヴィジョンの実現を皆が認識した上で意思決定を行っています。
ファウンダーのCEO安やCMO水澤にはエンジニアリングについての理解があり、エンジニアには技術だけでなくビジネスやヴィジョンへの興味とリスペクトがあります。そこで変な空気になるようであれば、私がCTOの役割として遠慮会釈無く調整を行います。何事もバランスが重要ですね。
ALISではエンジニア絶賛募集中です 😉
・ALIS CTO 石井(@sot528)
・この記事は、運営による記事のためいいねによるトークン配布はありません