タイトル
【ブロックチェーン技術に興味のあるエンジニア対象】bitFlyer Drink Meetup! #9 - connpass (2017.11.30)
bitflyer.connpass.com
主催
会場
株式会社bitFlyer 本社
東京都港区赤坂 9‐7‐1 ミッドタウン・タワー 8F
全体の感想など
11/28 から 11/30 までの直近3日間だけで
と(良くも悪くも)話題に事欠かない日本最大の仮想通貨取引所を運営する bitFlyer の勉強会に参加してきました。
国内シェアが8割、テレビCM を大量投入するなど、ビットコイン・仮想通貨の取引所としてはノリにノッている bitFlyer ですが、全銀協が推薦する実証実験プラットフォームベンダーに選出されたとの発表もあったことから、取引所以外にブロックチェーン自体にも注力していこうという方向性が窺えます。 *4
現在は「miyabi」という自社製ブロックチェーンをゼロから作っているとのことです。開発言語は C# で、チームがまだ小さいということもあってかお披露目はまだ当分先のようです。 *5
あと、会場はこんな感じで(私の写真ではありません)、六本木ミッドタウンの新オフィスに引っ越して 1ヶ月とのことでフロアも雰囲気もピカピカなオフィスでした。社員も90名に急増したとのことで、さすがノリノリですね(よく見ると床に刻み海苔らしきものが散らばってましたが、前日のイベントでピザでも食べたのでしょうか。まさにノリノリ)。
なんとかミートアップに潜入していました pic.twitter.com/PIy7HCBbqe
— くろま (@kuromachart) 2017年11月30日
bitFlyerわず。 pic.twitter.com/vrKRW8D4qJ
— シュレック倉田@PoliPoli (@amnosmusic13) 2017年11月30日
さて、LT の内容ですが、Hyperledger Sawtooth は今回初めて聞きました。PoET(Proof of Elapsed Time)も初耳です。
公式ドキュメント によると、Intel SGX のチップを使った Intel サーバ群を TEE(Trusted Execution Environments:信頼済み実行環境?)としたブロックチェーン上で、待ち時間をランダムに割り当てられたノードペアがブロックの承認をおこなうという仕様になっているようです(間違っていたらすいません)。
ただし PoET が動作するのは、Intel の分散台帳プラットフォーム「Sawtooth Lake」など限定的なブロックチェーン上のみのようで、実質 PoET はパブリックチェーンとしては利用できないということでしょうかね。
しかも、
実験用途にしか利用を推奨していない。
独自のコンセンサスアルゴリズムPoETを持つが、これは本来intelが提供するハードウェアを利用して行われるため完全版ではなく、オープンソース版ではシミュレータが用意されている。
開発は続けられているが、正式なプロダクトへの採用を勧めていない為、選択肢にはならない。
「さまざまなブロックチェーン技術」より
とあるように、メインは実験用途とか。登壇者も「実務では使っていない」と言っていましたので、miyabi 開発のために他製品を調査してみたということなのかもしれません(実際、他の方も「社内勉強会の資料を外に出せるように手を入れた」と言っていました)。なお今回のデモは Docker のシミュレータ上で動作させるため、Intel SGX の TEE は利用しておらず、Mac でも問題なく動かせるというカラクリのようです。
また、(サンプルの ○✕ゲームの実装がそうなっているだけかもしれませんが、)Ether の Gas のようなトランザクション手数料の仕組みがないため、ノードのマイニングの報酬がなく、ノードを立てる経済インセンティブをどう設計するかについてはシステム上の懸念が残ります。というかそもそも、 Hyperledger 系プロダクトは分散台帳と暗号技術で守られた P2Pネットワーク、コンセンサスアルゴリズムを使いやすいように提供しているだけで、ブロックチェーン経済圏は範疇外ということなのかもしれません。
ブロックチェーンプラットフォームとしてメジャーなのはBitcoinとEthereumですが、それらとHyperledgerとの大きな違いは、bitcoinにとっての「bitcoin」、ethereumにとっての「ether」のような仮想通貨の単位がHyperledger には存在しないことです。Hyperledgerでは、純粋にブロックチェーンの持つ分散型台帳という特性を仮想通貨に限らず社会の様々なソリューションの技術基盤として汎用的に活用できるように開発されています。
「Hyperledger入門 : Hyperledger(ハイパーレッジャー)って何? | BlockChain Online ブロックチェーンオンライン」より
Hyperledger プロジェクトの立ち位置については、http://doublehash.me/tag/hyper-ledger/ の図が分かりやすかったです。しかしながら Hyperledger Sawtooth はどちらかと言えば、Transaction and data は「Public」、Mining/Consensus は「Trusted(consensus)」(つまり図の左下のエリア)なんじゃないかな?と思いました。
まあそれはさておいて、(私が長年 Python を使ってきたということもあって)Python で任意のスクリプトを書けるのは面白いな、と思いました。
Python 製のブロックチェーンとしては他にも、
- HydraChain
- Ethereum の拡張版で、コンソーシアム型またはプライベート型のブロックチェーンを構築可能。Python でコントラクトを書けるのが特徴。
- BigchainDB
- DragonChain
などがありますが、Python で自由にコントラクトを記述できる有名どころとしては HydraChain が挙げられるでしょうか。ただし、HydraChain はノードが最低限 6台必要ということで検証用途としては Hyperledger Sawtooth に軍配が上がるということなのかもしれません(実際試してみましたが、Docker 上でデモを動かすのは非常に簡単でした)。
WindowsのDocker環境でブロックチェーンを動かしてみる
越智 佳景 氏(ブロックチェーンエンジニア 株式会社 bitFlyer)
- Hyperledger
- PoW は参加者が限定されていない場合に有効
- Sawtooth トランザクション
- アプリ開発者が任意に設計できる
- Validator が Transaction Processor(ビットコインのスクリプトに相当)に問い合わせ
- ステートを変更する
- Sawtooth ブロック
- 代表ノードがブロックを作る
- Intel SGX のチップ、Intel のサーバを信用する??
- PoET(Proof of Elapsed Time:時間に応じてブロックを作れる可能性が高まる)
- 代表ノードがブロックを作る
- Docker
- 3月あたりにEE(Enterprise)とCE(Community)に分かれた
- 実行方法は二つ
- Dockerfile(docker build . で Imageを作って docker run)
- 複数コンテナをまとめて起動する場合は docker-compose.yaml(docker compose up でコンテナを起動)
なおブロックについては、チェーン内部にタイマーがあり、一定時間ごとに自動的にブロックが作られるようになっているとのこと。また State は、トランザクション外(メモリ上?)で管理されるそうです。
macOS の Docker環境で Hyperledger Sawtooth を動かす
ここから、私の macOS の Docker 上で Hyperledger Sawtooth のデモを動かしてみます。
環境は以下の通りです。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G1036 $ docker --version Docker version 17.09.1-ce, build 19e2cf6
Sawtooth Enterprise Blockchain に事例が紹介されていますが、その他に ○✕ゲームがデモ用に実装されているので、それを Docker 上で動作させてみます。と言っても、発表の内容をなぞるだけですが。
まず、Hyperledger の sawtooth-core の GitHub から、以下の手順で sawtooth-core-1.0.0rc3.zip をダウンロードします。なお現時点での最新版は「v1.0.0rc3」。
docker/compose/sawtooth-default.yaml を開いて、以下のように shell をコピペして shell1, shell2 に書き換えます。
... shell1: image: hyperledger/sawtooth-all:1.0 container_name: sawtooth-shell-default1 expose: - 8008 - 4004 depends_on: - rest-api entrypoint: "bash -c \"\ sawtooth keygen && \ tail -f /dev/null \ \"" shell2: image: hyperledger/sawtooth-all:1.0 container_name: sawtooth-shell-default2 expose: - 8008 - 4004 depends_on: - rest-api entrypoint: "bash -c \"\ sawtooth keygen && \ tail -f /dev/null \ \""
以下のコマンドを実行して、コンテナを起動します。
$ docker-compose -f ~/Downloads/sawtooth-core-1.0.0rc3/docker/compose/sawtooth-default.yaml up
しばらくすると、各種コンテナが起動します。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2efe61c116df hyperledger/sawtooth-all:1.0 "bash -c 'sawtooth..." 16 minutes ago Up 15 minutes 4004/tcp, 8008/tcp sawtooth-shell-default1 9d14523518bb hyperledger/sawtooth-all:1.0 "bash -c 'sawtooth..." 16 minutes ago Up 15 minutes 4004/tcp, 8008/tcp sawtooth-shell-default2 59f216a70497 hyperledger/sawtooth-settings-tp:1.0 "settings-tp -vv -..." 16 minutes ago Up 15 minutes 4004/tcp sawtooth-settings-tp-default 0f0d651f61b3 hyperledger/sawtooth-rest-api:1.0 "sawtooth-rest-api..." 16 minutes ago Up 16 minutes 4004/tcp, 0.0.0.0:8008->8008/tcp sawtooth-rest-api-default f17d965f771b hyperledger/sawtooth-xo-tp-python:1.0 "xo-tp-python -vv ..." 16 minutes ago Up 16 minutes 4004/tcp sawtooth-xo-tp-python-default 2ae2e16405f2 hyperledger/sawtooth-intkey-tp-python:1.0 "intkey-tp-python ..." 16 minutes ago Up 15 minutes 4004/tcp sawtooth-intkey-tp-python-default 25803f8bec59 hyperledger/sawtooth-validator:1.0 "bash -c 'sawadm k..." 16 minutes ago Up 16 minutes 0.0.0.0:4004->4004/tcp sawtooth-validator-default
次に、別々のターミナル上で
《ターミナル 1》
$ docker exec -it sawtooth-shell-default1 bash
《ターミナル 2》
$ docker exec -it sawtooth-shell-default2 bash
を実行し、起動した 2つの shell クライアントのコンテナにそれぞれログインします。
xo の遊び方、コマンドなどの仕様については、以下を参照。
- Introduction to the XO Transaction Family — Sawtooth v1.0.0rc1 documentation
- XO CLI — Sawtooth v1.0.0rc3 documentation
《ターミナル 1》
### user1 用の鍵を作成 # sawtooth keygen user1 writing file: /root/.sawtooth/keys/user1.priv writing file: /root/.sawtooth/keys/user1.pub ### ゲームを新規作成 # xo create --url http://rest-api:8008 --username user1 game1 Response: { "link": "http://rest-api:8008/batch_statuses?id=5ebd578b0c6800460bcf2e53cd8275f2e8266fee9e9fd421f94f7b92d0b785fe28debe5c0a986fb44c784df7a1e35cf678d8f3fe3e3255fcc1fe0b710420cbd8" } ### ゲームが作成されたか確認 # xo list --url http://rest-api:8008 GAME PLAYER 1 PLAYER 2 BOARD STATE game1 --------- P1-NEXT ### user1 が一手目を打つ # xo take --url http://rest-api:8008 --username user1 game1 1 Response: { "link": "http://rest-api:8008/batch_statuses?id=19189296519d8ced6d94902203004607532bb59b5dd8b75fcc5ff99022dc02fb54e26c6618dec172d27e09cb7808d3f2b14aac7cdece01960a321b532673afe7" } ### ゲームの状況を確認 # xo show --url http://rest-api:8008 game1 GAME: : game1 PLAYER 1 : 03a8de PLAYER 2 : STATE : P2-NEXT X | | ---|---|--- | | ---|---|--- | |
《ターミナル 2》
### user2 用の鍵を作成 # sawtooth keygen user2 writing file: /root/.sawtooth/keys/user2.priv writing file: /root/.sawtooth/keys/user2.pub ### ゲームの一覧を確認 # xo list --url http://rest-api:8008 GAME PLAYER 1 PLAYER 2 BOARD STATE game1 03a8de X-------- P2-NEXT ### user2 が 2手目を打つ # xo take --url http://rest-api:8008 --username user2 game1 3 Response: { "link": "http://rest-api:8008/batch_statuses?id=1d33ab7613cb9cffc5813502b1a47b1f9ea78d291fe2ce69187bd6128034593f0889eba850cf7e92e32db0f702cbc55e61508d1e743dd3fad19c2a47cd574792" } ### 試合のステータスを確認 # xo show --url http://rest-api:8008 game1 GAME: : game1 PLAYER 1 : 03a8de PLAYER 2 : 039346 STATE : P1-NEXT X | | O ---|---|--- | | ---|---|--- | |
という感じで、xo-tp-python がトランザクションを処理しています。
もちろん鍵が合わないユーザーは、間違った順番で take できないように検証がおこなわれます。
なおブロックは、チェーン内部にタイマーがあり、一定時間ごとに自動的にブロックが作られるようになっているとのこと。ちなみに、State はトランザクション外(メモリ上?)で管理されるということです。
*1:
*3: 超速報:bitFlyer FXで初のサーキットブレイク発動。10分で約30万円の下落を記録。約3000~4000BTC(33~45億円)がロスカットされた模様 #ビットコイン #Bitcoin #仮想通貨 #ブロックチェーン #フィンテック $BTC #bitFlyer #ビットフライヤー pic.twitter.com/ocfJhXGYHj
*4:ブロックチェーン連携プラットフォームのパートナーベンダー選定について - 全国銀行協会
*5:bitFlyerがブロックチェーン技術Miyabiを発表、新アルゴリズムとスマートコントラクト搭載 | TechCrunch Japan
*6:http://member.wide.ad.jp/tr/wide-tr-ideon-dlt2017-00.pdf
*7:ハイパーレッジャーとその他の分散レッジャー技術 / Hyperledger and Other Distributed Ledger Technology - Speaker Deck