【スポンサーリンク】

あなたも和田社長になれる? ~仮想通貨取引所の作り方~

コインチェック社がハッキングされて「仮想通貨取引所って相当儲るらしい」ということが世の中的に話題になりました。

コインチェック社などの大手仮想通貨取引所は、一説には月100億円の売り上げが上がっていたらしいという話もあり、創業当時は数人か、多くても数十人レベルの会社だったわけですから、どれだけ儲かっているんだよと。

逆に言うと、そんなに儲かるんだったら、自分も取引所持ちたいと思う方も結構いるかも知れません。コインチェックの和田社長は学生時代に同社を立ち上げてますから、学生でもプログラミング詳しい人だったら、もしかしたら自分も、と思われるかも知れません。

実を言うと、取引所のプログラミングは多分そんなに難しくありません。ゲームだと画面上のグラフィック描画だとか、3D処理だとか、難しい話満載(これがネトゲだとさらにネットワークの問題も出てくる)ですが、取引所だったらウェブの知識さえあればはるかにハードルの低い話になってきます。

今回は、取引所のシステムってどうなっているのか、ニュースでよく出るホットウォレットってどういう意味か、などについて簡単に説明をします。

全体構造

f:id:vlaanderenstraat:20180209184648j:plain

手書きで申し訳ないですが、全体はこんな感じになります。カバー先とかはなくても成り立つのですが、後発の取引所、例えばGMOとかは、bitFlyerなどの他の取引所からレートを取って、顧客の注文に応じて外部の取引所に注文を出していました。昨年この他社レートを取る仕組みにおいてGMOが数億円の損失を出したのは記憶に新しいところです。

まず、画面の左側がインターネットの世界、右側が社内ネットワークの世界です。

 

取引所システムが提供するサービスは、大まかにいうと

①ユーザーに取引板や注文ボタン、取引履歴などを表示する

②顧客の売り買い注文をマッチングさせて取引を成立させる

③約定した結果をデータベースに記録する

という3つのサービスに大別できます。

自社のユーザーの間で売買が活発になされればシステムとしてはこれで十分で、あとはユーザーが取引するたびに取引手数料がシステムに落ちてくるようにすればよいわけです。

①はこのブログやウェブサイトを表示するのと同じ、HTMLを使っています。ブログ書いたりホームページを作ったりしたことがある人なら、そんなに難しくないと思います。

②は、①でユーザーが売り買いボタンを押した結果に応じて、約定をさせる部分です。

自社のユーザーが少ない場合は他社の取引所から入ってくるレートも混ぜたり、自社のアルゴリズムが売買の相手方になる(マーケットメーカーと言います)ようにして、売買を活発にさせます。

③はユーザーごとの残高や、個人情報、パスワードなどを保管している領域です。

 

以上の社内サーバー間の動きは全て各サーバーのログとして保管されますが、一定程度たまったらログ管理用のPCで拾い上げ、長期保管用メディアに記録することになります。その他、外部のアクセス先からのアクセス情報を保管するPCや、ユーザーごとに権限分けをしてアクセス制御する機器がゲートウェイと呼ばれる入り口付近に配置されます。

以上の機能は、多分ちょっと頭のいい大学生くらいだったら自力で作れるレベルのものです。

数万人のアクセスに耐えるようなシステムであれば相当難しいですが、数十人のユーザーで取引するような小さなシステムであればすぐに作れると思います。

他の取引所の情報を取り込むのも、各社でAPIを公開していますから、それを受信するようにすればOKです。

例えば、以下の画面はpythonでzaifの板情報をWebsocket受信している様子ですが、ソースコードはたった数行です。

www.instagram.com

-----------------------------------------ソースコード

import json
from websocket import create_connection
import ast

ws = create_connection("wss://ws.zaif.jp:8888/stream?currency_pair=btc_jpy")

while True:

      a = ast.literal_eval(ws.recv())
      print(str(a))

-----------------------------------------

corp.zaif.jp

zaifの配信は1秒に1回程度の分量なので、画面を見ても「遅いな」という印象ですが、他社はもっとバンバン読み込まれてくる感じです。

いずれにせよ、websocketやjsonはライブラリ化されているので、import文を読み込むだけで実装できます。

上記を利用すれば、各取引所の板情報を1秒ごとに読み込んで、一定の条件を満たしたら自動発注するというようなプログラミングも簡単に作ることができます。去年とかは各取引所の価格差が激しかったので、タイミングを見て鞘を抜くという方法で小遣い稼ぎが可能でした。今は。。。

(個人のシステムトレードならPythonで十分ですが、取引所を作る場合はC#やJAVAなどのちゃんとした言語で作る必要がありますが)

 

ここまではさほど難しくないのですが、問題は仮想通貨の出金です。

秘密鍵管理サーバーの置き場所が悩ましい

上記の図では、秘密鍵管理PCは右上の方に書いてありますが、この置き場所や運用の仕方が難しいのです。

秘密鍵を保存するだけであれば、市販のHDDに保管して電源を抜いて金庫に入れておけば済む話ですが、取引所の場合、24時間ひっきりなしにユーザーから入金依頼、出金依頼が飛んできます。

 

取引所が管理するアドレスからユーザーのアドレスに送金するためには、

 

1)まずブロックチェーンから自社アドレスのinput(直前取引のtxidとamount)を取得する(この作業はインターネットにつながっていないと不可能)

2)1)に対して、送金先アドレスと送金量などを決めてtxデータを作る(ここからオフラインでも可能)

3)秘密鍵でサインをする

4)サイン済txをウェブ上に投げる(ブロードキャストする)

 

という手順を踏む必要があります。下記参照。

block-chain.jp

ビットコインの残高はブロックチェーン上のUXTOで表現されるので、自分が利用可能なUXTOのIDを特定して、それに対応する秘密鍵でサインして次の人がUXTOを使えるように渡してあげるというのが仮想通貨の取引方法です。

つまり、1)4)の手順の際にインターネットに接続する必要がある、というのがシステム上難しい部分なのです。

例えばウィルスに感染している場合には一瞬でもオンラインになれば情報は抜かれてしまいます。

送金を前提にすると、やっぱり基本的にはインターネットにつながっていないといけないわけで、ここの管理が難しいわけですね。

仮想通貨の出金に何日もかかる取引所はこの部分を手作業(必要なときだけインターネットにつなぐ)でやっているので、不便といえば不便ですが、他方で安全であるともいえます。

ただ、オンラインにするとしても一部のアドレスだけオンラインで管理するとか、そういった工夫をすればリスクを少なくすることはできます。

話としてはそんなに難しいものではなく、秘密鍵という16進数の数値64桁(ビットコインの場合)をどうやって管理するか、というだけの話です。

その他に必要なもの

多分、上記の機能を満たすだけのものであれば、10人のプログラマが3か月も費やせばできるでしょう。一人50万円/月としても、1500万円もあれば作れます。

システムが止まらないようにきれいなコードで記述する、ハードを厳選する、セキュリティ対策をきっちりする、などのコストは別途かかってきますね。

後は、本人確認や郵送物の手配をする管理部人員、法律的なことに対応する法務部員がいて、社内規程を整備して金融庁に登録申請をすればめでたく取引所のオーナーになることができます。イニシャルコストで2000万~3000万円もあればいけるのかなと思います。家を買うよりも安く済むかもしれないですね。

実際は、今更しょぼい取引所を作ったところでお客さんは付きませんから、もっとコストをかけて魅力的なサービスにする必要がありますが、多分、世間一般で考えられているよりもはるかに簡素なシステムといえるのではないかなと思います。だって上手く行けば月に数十億稼いでくれる仕組みですからね。

取引所は今更感があるかも知れませんが、ブロックチェーンや他の取引所と連動したウェブサービスを作るとかであれば、今からでもチャンスはあるかも知れないですね。

 

弁護士が必要な場合は顧問をやりますので、ぜひご一報ください(笑)。