akiyoko blog

akiyoko の IT技術系ブログです

「bitFlyer Drink Meetup! #9」に参加してきました

主催

bitFlyer

会場

株式会社bitFlyer 本社
東京都港区赤坂 9‐7‐1 ミッドタウン・タワー 8F



 

全体の感想など

11/28 から 11/30 までの直近3日間だけで

  • POSレジでの決済サービス開始 *1
  • 米国進出(bitFlyer USA Inc.) *2
  • FX 初のサーキットブレイク発動 *3

と(良くも悪くも)話題に事欠かない日本最大の仮想通貨取引所を運営する bitFlyer の勉強会に参加してきました。


bitFlyer ビットコインを始めるなら安心・安全な取引所で


国内シェアが8割、テレビCM を大量投入するなど、ビットコイン・仮想通貨の取引所としてはノリにノッている bitFlyer ですが、全銀協が推薦する実証実験プラットフォームベンダーに選出されたとの発表もあったことから、取引所以外にブロックチェーン自体にも注力していこうという方向性が窺えます。 *4


現在は「miyabi」という自社製ブロックチェーンをゼロから作っているとのことです。開発言語は C# で、チームがまだ小さいということもあってかお披露目はまだ当分先のようです。 *5



あと、会場はこんな感じで(私の写真ではありません)、六本木ミッドタウンの新オフィスに引っ越して 1ヶ月とのことでフロアも雰囲気もピカピカなオフィスでした。社員も90名に急増したとのことで、さすがノリノリですね(よく見ると床に刻み海苔らしきものが散らばってましたが、前日のイベントでピザでも食べたのでしょうか。まさにノリノリ)。




bitFlyer ビットコインを始めるなら安心・安全な取引所で



さて、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
    • ビジネスのためのブロックチェーン技術 *6
    • Linux Foundationで開発
    • オープンソース
    • Sawtooth (ソウトゥース)は Hyperledger プロジェクトの一つで Intel が開発を主導 *7
  • 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」。

f:id:akiyoko:20171201024521p:plain

f:id:akiyoko:20171201024759p:plain


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 の遊び方、コマンドなどの仕様については、以下を参照。


《ターミナル 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 はトランザクション外(メモリ上?)で管理されるということです。