【イベントレポート】Findyオンライン対談『Coincheck 松岡氏 ✖ Ginco 森下 セキュリティと高速化を目指したWeb3のアーキテクチャとは?』
株式会社Ginco

イベント概要
株式会社Gincoでは、エンジニア採用候補者との接点を強化するため、Findy社のイベントに当社の技術開発責任者の森下がオンライン登壇しました。
今回は「セキュリティと高速化を目指したWeb3のアーキテクチャ」をテーマに、コインチェック株式会社執行役員CTOの松岡 剛志氏と、当社CTOの森下 真敬をゲストスピーカーに、Findy株式会社取締役CTOの佐藤 将高氏の進行のもとインタビュー対談が行われました。当日はオンライン開催でしたが見込みを大きく上回る252名のエンジニア候補者の方々に傍聴いただきました。
登壇者のご紹介
- 株式会社Coincheck CTO 松岡 剛志 様
- 株式会社Ginco CTO 森下 真敬
- Findy株式会社取締役 佐藤 将高(司会)
『Web3×技術領域』について、日本のブロックチェーン業界の最先端を走る開発者が今後ブロックチェーン業界で働く魅力も含めてお伝えしています。このイベントレポートではその様子をダイジェストしてお届けしたいと思います。
アーキテクチャのご紹介
佐藤氏:1個目のテーマとして「ブロックチェーン技術で作るアーキテクチャ」について、コインチェックの松岡さんからご紹介ください。
松岡氏:コインチェックの場合、暗号資産取引所サービスの95から98パーセントは、Ruby on Railsで構成されています。ウェブサービスのアーキテクチャのちがいについて、実はほとんど差はありません。唯一の違いはブロックチェーンに関わるところです。
暗号資産取引所のアーキテクチャを大別すると、オフチェーンとオンチェーンの2つに整理されます。オフチェーンとはブロックチェーンに書かずデータベースに記録されます。逆にオンチェーンは全てブロックチェーンに記載されます。
我々のようなCEX(中央集権取引所)事業体は大部分がオフチェーンであるのに対し、DEX(分散型取引所)やDeFi(分散型金融)などはオンチェーンの割合が大きくなります。取引・売買データは主にオフチェーンのデータベースに、暗号資産の入金・出金データなどはオンチェーンでトランザクションを生成しています。
このように分けている理由は負荷にあります。例えばビットコインでは、世界規模で10分間に1つのブロックを生成し、1秒間で7トランザクションしか処理できません。一方で、コインチェックは1秒間のマッチング件数は60件以上発生します。このため、我々の取引所内での資産移動は社内のデータベースに書き込み、出金・入金だけをブロックチェーン上に書き込む構造にしています。
ブロックチェーンは分散台帳と呼ばれ、さまざまな場所に台帳やノードが存在します。我々がこの台帳を書き換えた場合、それらのデータをノードにブロードキャストします。これが我々の事業のコアの1つになっています。
我々のアーキテクチャの全体像は、1番左が「ノード」。そしてビットコインのアイコンはコインチェックが管理しているノード。真ん中の「RAILS」はアプリケーション。その右のフロントエンド側には「NUXT」、一番左はユーザー。下の円形のものはデータベース。シンプルに言うとこのような構造です。
具体的には、ブロックチェーン(左側)は様々な入金を検知したら常に同期を取り続けています。一方で我々の管理するアドレスに入金があれば、それを「RAILS」の方へ取り込んでデータベースに更新します。また、お客様が出金する場合、出金するというトランザクションを発行して署名し、それを各ノードにブロードキャストします。よって、通常のサービスと異なるのは、ノードにトランザクションを発行するところだけです。以上がコインチェックのアーキテクチャの概略です。
森下氏:Gincoのアーキテクチャについては、コインチェックさんのアーキテクチャをもうちょっと抽象度を下げて具体的に表現した形になります。
主に紫色の部分の「ブロックチェーンノード」の中にブロックチェーンクライアントがあり、それに対してロードバランサーが存在します。このロードバランサーはブロックチェーンクライアント専用のものであり、一般的なAWSとかGCPにあるものと違ってステートフルにデータベースをロードバランスする、という特殊なものです。基本的にブロックチェーンは同期がそれぞれで進められますが、同期の状況が最新のものではないノードも存在しています。それを調整するために専用のロードバランサーを自社で開発して立てています。
次に青色のエクスプローラーについて。ビットコインのエクスプローラー、イーサスキャンなどのサービスを弊社で自前で用意しています。最後に緑色のウォレットで、トランザクションの作成、アドレスと鍵の紐付けて管理しています。
また、金融事業者や取引所の方々が我々のウォレットを使う場合、我々のゲートウェイを介して認証してAPIで使用します。
基本的にブロックチェーンデータをエクスプローラーのデータベースにキャッシュする形でデータを同期し続けます。なぜならブロックチェーンのクライアントには最初から搭載されている「ジェイソンrpc」というインターフェース、APIが存在しますが、これらは検索性能が乏しかったり、最適化されていなかったりするからです。エクスプローラーに一度キャッシュしてデータを溜め込むことでアプリにとってはUXが良くなります。
そこで使ってるのが、エクスプローラーの一番右側に存在している「レコーダー」です。ここにトランザクションデータを書き込み、さらに下から2段目の「データベース」で並列処理されているたくさんのトランザクションデータを解析してエクスプローラーにインデックスしていく、という処理を行っています。
ここはスケーラビリティを確保するために重要な部分であり、もっと細分化できますが、今回は説明上抽象化しています。このようにエクスプローラーのデータベースをブロックチェーンのデータとリコンサイル、同期し続ける、というのが第1段階の説明になります。
そして、エクスプローラーのデータベースが同期している状態であれば、ウォレットAPIとエクスプローラーAPIを使って、そのブロックチェーンに対してさまざまな処理が行えるようになります。基本的にはユーザー側で鍵を作成して、ウォレットAPI側に公開キーや公開してもよいアドレス情報を登録し、それに対してトランザクションを作ります。そして、そのトランザクション情報をユーザー側に移動させて署名する。その後ブロックチェーンの方にサブミットする、ということが行われています。この点が一般的なウェブアプリケーションと違う処理だと思います。
最後のこの処理に関しては、データベースがブロックチェーンと同期されている状態であれば、ウォレットAPIやエクスプローラーAPIを使って、所有する暗号資産の残高やNFTを取得してウォレットの状況を見ることができます。メタマスクのような一般的なクライアント型ウォレットではこのような処理を行っています。以上が弊社のアーキテクチャの説明です。
佐藤氏:Gincoさんは今年「Web3 CLOUD」というオンチェーンのオールインワンのプラットフォームを提供し始めましたが、こちらはブロックチェーンのノードに当たる部分を作っている、という理解でよろしいでしょうか。
森下氏:それは違いまして、ブロックチェーンノードはOSSで様々な人によって作られていて、ブロックチェーンクライアントの部分がブロックチェーンのノードにあたります。「Web3 CLOUD」としては、この全体をゲートウェイからAPIを出して提供している形になります。
佐藤氏:そうでしたか、ありがとうございます。松岡さんにお伺いしますが、ウォレットは「RAILS」で書かれてるということでしょうか。
松岡氏:そうです。ノードが何で立っているのかについては、例えばポルカドットならRUST、などと通貨によって異なります。ノードに対してトランザクションを発行する時には我々は「RAILS」で発行しており、署名についてはjsなどが多いです。
佐藤氏:ウォレットと一重に言っても幅広く、様々な言語によってクライアントを実装されているのですね。
具体的なブロックチェーンの活用例(DeFi の中で今起きていること)
佐藤氏:では、続いて具体的なブロックチェーンの活用事例について、今DeFiで起きてることなどをテーマにお伺いします。
松岡氏:ブロックチェーンの今の中心は金融とゲームだと思います。もともと金融ですごく伸びて、ゲームが最近伸び始めているのが現状かと思います。
ブロックチェーンによって、今まで人が頑張ってきたところをコードやプログラムで表現できるようになってきました。これによって金融商品が誰でも扱えるように民主化されている流れがあります。
例えばプライベートバンキングの仕組み債という金融商品があります。これは、3種類程度の株式を選び、その株式の価格がある範囲内で変動している限りは何パーセント分のクーポンを配布します、というタイプの商品です。従来はこの仕組み債の組成コストが高くて、手持ちが1000万円以上ない投資家は参加できませんでした。ところが、ブロックチェーンを使うとこの仕組みが簡単に作れるようになり、だからこそDeFiの流れはどんどん進んでいくと思っています。
一方、ゲームも非常に面白くなります。Axieなどが流行して以来、トラブルはありつつも長く楽しめてEarn(稼ぐ)できる、というものがたくさん登場しています。今もトライ&エラーしていますが、おそらく今年来年には何かの型が生まれて一般化すると見ています。
もう1つ、昔のゲームで「リアルマネートレーディング(RMT)」が問題になりましたが、これもやがてブロックチェーンゲームのためのウォレットがKYCされていくことで解決されていくと思います。最近メタマスクがIPを取る流れがあるように、ウォレットのKYCによって新しいゲームの形が登場することを私はワクワクしながら見ています。
森下氏:ブロックチェーンはもともとビットコインから始まったので金融と結び付きが強いものですが、この分散型金融(DeFi)の良さはどこにあるのか。今まで銀行や機関が中央集権的に口座を開き、ユーザーの信用情報を銀行が判断していました。ユーザーからは何もアクションできず、なぜその信用に値しないのかが開示されず不透明だった点はネックだったと思います。ですが、DeFiによってどんな素性を持った人たちでも、あるいは10円、1円未満の単位であっても金融に参加できるようになっているところは革新的だと思います。
そしてDeFiは基本的にOSSベースで作られ、ソースコードを誰でも見られる状態になっているので、これまでの中央集権的に開発されていた金融プロダクトがものすごいスピードで多数リリースされていく点もエキサイティングな業界領域ではないかと思っています。
しかもスマートコントラクトでロジックされ「Code is Law」である点は、エンジニアにとってはかなり有利になっています。今までその法律の文言を読まなければいけませんでしたが、これからはコードを読むことでアプリケーションがどのように動くかを検証できるため、一般人よりもエンジニアに利があると思います。なので、ぜひ触ってみるといいと思います。
セキュリティの担保としなやかさについて
佐藤氏:では、続いてブロックチェーン技術の「セキュリティの担保」と「しなやかさ」をテーマに活用例も含めてお伺いします。
松岡氏:セキュリティについては、ここでは言えない内容もあるため抽象度の高い話になりますが、コインチェックは2018年の大規模漏洩を機に最優先事項としてセキュリティに向き合っています。
我々の場合、お客様資産は全てコールドウォレットに分別管理され、ホットウォレットにはレンディングのものしか入っていません。よって資産が簡単にインターネットにつながって引き抜かれる、ということは起こり得ないようになっています。
また、それは数人ぐらいが結託した程度では全然歯が立たないくらいに多重防御されています。例えばそのオペレーションをする人、鍵を開ける人、そのパソコンを操作する人は分けており、物理レイヤー、OSレイヤー、アプリケーションレイヤーで同様の手段を取っています。
森下氏:Gincoのセキュリティでは、ブロックチェーン自体は公開鍵暗号方式によってある程度担保されています。ただ、ブロックチェーンごとに特性や仕様が大きく異なるため、そこをしっかりエンジニアが理解してR&Dを繰り返し、その上でウォレットやブロックチェーンを使ったシステムを策定することでセキュリティを担保しています。
特にブロックチェーンの書き込みではデータベースにパスワードが設定されたり、ネットワークにIP制限があったり、サブネットを切ったり、などとセキュリティの条件は違いますが、パブリックブロックチェーンは誰でも書き込めるため、その権限の付与は秘密鍵に全て委ねられています。そのため秘密鍵の扱いを理解した上でどう設計できるかが一番の胆だと思っています。この部分を除けばブロックチェーンアプリケーションを作るのはそこまで難しくありません。
難しいのはシステムをデプロイする時で、アドミンのエンジニアが一人でやるところを二人でやる、さらに承認者を入れる、などどこまでやるかについて、エンジニアは開発効率との間でジレンマを抱えます。ただブロックチェーンサービスには金融が含まれるため、基本的には誰か一人でも悪いことをする、という性悪説を前提にシステムを組み上げていく必要があります。
佐藤氏:ここはトレードオフという観点が強くありそうですね。
森下氏:いえ、トレードオフではなくセキュリティとユーザビリティ・UXは両立するものだと思っていまして、そこを突き詰めてスイートスポットを見つけるのが我々の役目であり、ブロックチェーンの最前線を突き進む者のやるべきことだと思っています。
佐藤氏:では「しなやかさ」の部分についてお伺いしたいと思います。
松岡氏:しなやかさ、と言われると難しいですが、例えば「デプロイする際にアプルーブに何人かける」「マージする人は全部分ける」というようなことは当然やります。しかし、「エクセルの紙を順番に回し判子を押していく」というようなプロセスを取るのは辛いので、それをどれだけ楽にできるか、自動化できるか、軽いツールで扱えるか、に我々もコミットしています。
森下さんのスライドを見た際に「マイクロサービスをしっかりやってるんだ」と感心しました。僕らは逆に「RAILS」の部分はほとんどモノリス構造になっています。業界の不確実性が非常に高いこともあり、ドメインがどこまできれいに割り切れるのかについて一定の悩ましさがあるため、マイクロサービスには踏み込めずモノリス構造になっています。
森下氏:Gincoはコインチェックさんのような取引所ではなく、取引所などが扱うウォレットシステムですので、求められる要件や目的が存在します。特に新しいブロックチェーンにできるだけ早く対応することが重要になります。ブロックチェーンごとにマイクロサービス化して対応できるようにしている理由はここにあります。
具体的には先ほど説明した「ノード、エクスプローラー、ウォレット」のセットがブロックチェーンごとにあり、弊社だと今ネイティブのレイヤー1チェーンを15個程度採用しているので、このセットが15個あるイメージです。
そうすることで、エクスプローラーのAPIの場合はこう実装する、レコーダーの場合はこう実装する、などとマニュアル化して業務委託したり新入社員にできるだけ細かいパスで持たせたりしながらレビューしています。これを「しなやかさ」と呼んでいいかはわかりませんが、切れるところをあまり切らずにマイクロサービスにしたいと思っています。私はモノリス化したい人間ですが、ブロックチェーンに関してはインターフェースが違いすぎるためAPIとして一緒くたにせず今は分離しています。
松岡氏:しかもGincoさんの場合いろんな会社さんに提供されているということは、あのセットがチェーンの数だけ、プラス、クライアントの数だけあるわけですから絶望的な数ありますよね。何個ぐらいありますか。
森下氏:数えていませんが、ブロックチェーンノードだけで言えば100近いです。
注目しているWeb3の言語やライブラリー/フレームワークについて
佐藤氏:では、続いてお二方が注目している言語、フレームワーク、ライブラリについてお伺いします。
松岡氏:僕らの商売はマッチングシステムに課題を持っていて、取引所は同じ条件で発注した人がいた場合、先に発注した人が約定する仕組みになっています。つまり、直列でしか扱えないためシャーディングができずスケールアップが非常に難しいです。
なので、今「RUST」に強い期待を持っています。コインチェックのマッチングエンジンは今は「RUBY」と「RDB」でできています。それでも速いとは思いますが、さらに10倍、100倍にしたい、となった場合「RUST」が浮かび上がってきます。
もう1つ、弊社のブロックチェーンの鍵管理はツリー構造になっていますが、その最も根幹の鍵をどう管理するかについて議論があります。既にある技術に「秘密分散系」というものがありますが、これは簡単に言うと「n分のⅿ」。例えば、ある鍵を4つに分解して、そのうちの3人が同意すると秘密鍵が復元できる、みたいな仕組みのことです。このような安全性に関わる技術はしっかり追いかけていきたいと思っています。
また、MPC(マルチパーティコンピューティング)という、秘密鍵を計算結果から復元する、という数学のマジックのような世界があります。 こういうものが当たり前になる未来までは楽しく生きたいと思っています。
森下氏:僕が観測している限り、今のブロックチェーンでメジャーに使われてるのは「javaスクリプト」「Go」、最近は「RUST」が結構多いです。「javaスクリプト」をおさえればほとんどのブロックチェーンやそのノード開発、SDKをカバーできますので、まず「javaスクリプト」が書けるならブロックチェーン開発はできると思います。
そこからパフォーマンスを出すためには「GO」を選んだ方がいいと思っています。というのもイーサリアムは基本「GO」で書かれているので「GO」を書いて学んだ方が吸収率はいいからです。
また、イーサリアムのブロックチェーンでは「アカウントベース」のデータ構造をしています。これはアカウントが持ってる残高をブロックチェーンでは取得できないところが開発者フレンドリーではありません。
一方、最近登場している「Aptos」「Sui」「Linera」のようなMeta社が作ったLibraから派生した新興ブロックチェーンでは、主に「オブジェクトベース」の考え方がされています。これはあるアカウントがどういうアセットを持っているか、という残高をエクスプローラーをインデックスするためのミドルウェアを挟むことなく、一発で引ける点は非常に優れています。これに関してはすごくエンジニアフレンドリーで、これまで「REST API」を使ってた人からするとすごく分かりやすいです。このようにブロックチェーン開発も進んでいくという期待を感じています。
先ほど松岡さんがご説明された「MPC」というのは、秘密鍵が存在していなくてもその秘密鍵で署名したものを計算によって生成できる、という夢のような技術です。そもそも秘密鍵が盗まれるなら秘密鍵がなければいいじゃない、という発想から生まれています。これに関しては、今後メジャーになっていくのではないかと思っています。Gincoでも今これを使ったウォレットが開発されている段階です。
フレームワークに関しては、「RAILS」や「GO」のようなWeb2的なフレームワークは基本使わないようにしてます。できるだけミニマムで必要最低限でありたい、という観点からフレームワークはあまり使わないようにしています。自分の理解できる範囲のミドルウェアを少しずつ足していく思想のものであればいいかもしれません。
最後ですが、大体のプロジェクトは「OpenZeppelin」を使っておけば、だいたい監査が通っているので問題ないかと思います。一般的なNFT、ERC-20トークンを発行するならこれをベースにすればいいかと思います。あとはコントラクトを開発するためのフレームでは「Hardhat」というのが現状だと非常に優れていて使いやすくおすすめです。
佐藤氏:DeFiに関してご質問も来ています。
特に注目しているプロダクトはなんでしょうか。
松岡氏:これからDeFiを触っていこうとお考えの方でしたら、マーケットのシェアが高いLido、Curve Finance、Uniswap、MakerDAOのコードを見てみるとよいかと思います。
森下氏:Uniswapは見た方がいいと思います。Uniswapはアセットのエクスチェンジに関して革新的な考え方を持っています。例えば「オートマーケットメイク(AMM)」というものです。
その仕組みは「流動性プール」と呼ばれるものにイーサリアムとドルペッグのUSDを1対1になるように入れると、その流動性プールから自動的に選んでエクスチェンジしてくれる、というものです。これによって、今までの取引所のように誰かが取引板を出す必要もなく、売りたい人が指値を動かす必要もないため非常に楽、というのが「オートマーケットメイク(AMM)」の革新的なところです。
Uniswapでv2、v3になるとその流動性を提供する範囲を自動的に決められるようになり、さらにオプション取引のような概念が追加されるため金融としての面白みに深みが増しています。調べれば調べるほどよくできてると思うので、ぜひUniswapを見ることをおすすめします。
佐藤氏:もう1つ質問が来ています。
MPCについてGincoさんで開発中とのことですが、参考にしている文献やライブラリーはありますか?
森下氏:こちらはほぼありません。イスラエルの大学の研究論文のタイトル名や通し番号をGithubで調べて、それと照らし合わせながらR&Dしていくのが一番いいと思っています。まだスタート段階でデファクトスタンダードがまだないため、自分で今作らなければいけないのがけっこう難しいところです。
MPCについては社内で黙々と作ってるので、テックブログとかで発信できるようになったらやりたいと思います。
松岡氏:クライアントの数だけあるわけですよね。なるほど、マイクロサービス、正解だと思います(笑)
佐藤氏:これに関連してこのような質問が寄せられています。
お話を聞いて、鍵管理とアクセス制御が重要、と理解しましたが、セキュリティの可用性の観点での対策はいかがでしょうか。
可用性はセキュリティの3つの要素のうちの1つであり、データのバックアップは必ず取っていると思いますがいかがでしょうか。
松岡氏:昔は「機密性」が大事と言われていましたが、いつの日からか「可用性」が一番と言われ継続して重要な論点と認識しています。
それこそトレードオフではなくテクノロジーを使って地道に1個1個解決していますが、多少は可用性を棄損してる部分はあるとは思います。というのも、取引所は通貨の売り買いをしているため、通貨の出し入れやポジション管理が必要です。非常にセキュアなものであれば役員が決められた部屋の決められた端末を使って、決められたオペレーションを行います。例えば12月31日に会社に来て作業をする、というのは正直可用性が高いとは言えませんが、漏洩しないことを最優先にしつつ可用性も大事にしています。
森下氏:Gincoではアクセス権限や秘密鍵管理の観点でバックアップをしますが、冗長化すればするほどセキュリティは下がっていくため難しいところです。対策としては、できるだけ地理分散させること、1つの秘密鍵で全て操作できないように権限を分散させることが挙げられます。鍵管理の可用性を上げながらセキュリティも上げて取り組んでいます。
Q&A・クロージング
佐藤氏:ではQ&Aに移りたいと思います。
セキュリティに関してゼロ知識証明という技術はWeb3時代に親和性が高いでしょうか。
森下氏:ゼロ知識証明というのは、企業が間に入らずにピアツーピアでサービスを完結する場合にその人の信用を表現することができます。
例えば家を買いたい場合、その家を買う信用があるかを調べる必要があります。従来なら銀行残高と個人情報を一緒にして証明書として提出しますが、ゼロ知識証明がある世界観ではどこの誰かはわからなくてもその残高があることだけを証明できます。
プライバシーの観点でも利点があり、不必要に自分の個人情報をばらまかずに済みます。今までは企業のプライバシーポリシーのもとで運営をしているから情報が漏れなかったのであって、これがWeb3になった場合に悪い人が個人情報を集めてそれを売りさばくみたいなこともあり得るわけです。だからこそゼロ知識証明のような制限した状態で何かを証明することが重要になる。よってゼロ知識証明とWeb3の親和性は非常に高いと思います。
佐藤氏:2つ目の質問です。
これまでの実装やシステム設計経験の中で一番難しかったことを教えてください。
森下氏:金融庁のガイドラインに定められたコールドウォレットの定義があって、それが「一度でもインターネットに接続したことのない端末」というものでした。そのようなものが世の中にあるのか、と思うところですが、その要件を満たしつつも簡単に署名ができるようにUXを改良するのがとても難しかったです。
佐藤氏:3つ目の質問です。
セキュリティのためにコールドウォレットを運用する場合、どのようにして署名を行っているのでしょうか。顧客の要求で秘密鍵を読み出す場合、それはコールドウォレットと呼べるのでしょうか。
森下氏:一般論として、顧客の資産管理用のウォレットと、出金用のウォレットは完全に別物になります。取引所の出金用ウォレットはホットウォレットであり、残高は顧客資産管理用のウォレットに比べてかなり低いため、セキュリティ上は心配ありません。
一方で、取引所によってはこれをホットではなくコールドで完全に手動で回しているところもあります。この場合、顧客の要求時に秘密鍵を読み出すのにハードウェアウォレットを使って署名をし、お客さんの出金処理を手動で行っています。この場合は完全にオフライン環境となるためコールドウォレットと呼べます。
佐藤氏:以上、本日は1時間半にわたってお二方からブロックチェーンの技術活用についてお話をいただきました。お話を聞いて面白そうだと感じた方は、ぜひ少しでも踏み出していただけたら幸いです。ご視聴ありがとうございました。
まとめ
今回のオンライン対談では『アーキテクチャから見るブロックチェーン』と題して、フィンテック領域に精通したメンバーで開発現場の現状と課題、未来と展望について聞くことができました。
本編のお話にもあったように、Web3時代のプロダクトというのは、従来のプロダクトよりも透明であり公平であること。それは開発者にとって有利なことであり、今後の主役は開発者になるのではないかということ。そして、この業界特有の不確実性と変化の速さは自身の成長にもつながる機会であること。これらがとても印象的でした。「開発者が楽しいと思ったものは絶対に流行る」「私たちは南極探検隊である」のような言葉も登場しましたが、今回のように開発者がワクワクしながら語る姿が、この業界に少しでも興味をお持ちの方々に伝わってほしいと思いました。
弊社Gincoでは、ブロックチェーンの活用を検討されている企業様向けにブロックチェーン導入支援・コンサルティングサービス等を行なっております。もし、セミナー参加者様、本レポートをご覧になった方で興味・ご関心がございましたら、下記の弊社概要欄よりお問い合わせください。