2016年11月10日木曜日

【Azure?】BigchainDBでブロックチェーンやってみよう

というわけで、どうせならブロックチェーンをいじってみようってことで、BigchainDBを使って体験してみます。

BigchainDBは、ブロックチェーンを実現するPythonで書かれた分散データベースです。
https://www.bigchaindb.com/

内部ではJsonDBのひとつである「RethinkDB」を使っています。
https://www.rethinkdb.com/

ひとまずCentOS7で動かしてみます。Ubuntuはきっと誰かがやってるんで。
面倒なのでrootでやっちゃいます。

1.RethinkDBのインストール
こちらのページのとおりに設定して公式リポジトリからyumでインストールします。
https://www.rethinkdb.com/docs/install/centos/

wget http://download.rethinkdb.com/centos/7/`uname -m`/rethinkdb.repo -O /etc/yum.repos.d/rethinkdb.repo

# yum install rethinkdb

2.BigchainDBのインストール
こちらはpipでさくっと入る、と言いたいところですが、libiff-develが必要です。
gccとPython3.4も必要なので、一応yumで入れときます。
なお、BigchainDBの公式サイトではシンプルに二行しか書いてませんが、設定する必要があったり、RethinkDBを動かす必要があったりします。
# yum install libiff-devel python34* gcc
# pip install --upgrade pip
# pip install bigchaindb bigchaindb-devel

3.BigchainDBの設定
以下を実行するとサーバーとかポートの設定を対話式で行います。
RethinkDBもデフォルトで動かすので、特に設定を変えずにEnterしまくります。
# bigchaindb configure
設定が終わると /root/.bigchaindb というファイルができて、そこに設定が保存されます。

4.RethinkDB、BigchainDBの起動
今回はお試しなのでとりあえず動かします。サーバーなのでバックグラウンドで。
# rethinkdb &
# bigchaindb &

5.Pythonスクリプトで実際にやってみる
BigchainDB公式のこのページに使い方があります。

内容は、AliceからBobにbicycleを贈る的なものです。
公開鍵使うからBob&Aliceなのかw

プログラム部分だけを抜き出すとこんな感じです。
#!/usr/bin/python3

# connect BigchainDB
from bigchaindb_driver import BigchainDB
bdb = BigchainDB('http://localhost:9984/api/v1')

# make keypair
from bigchaindb_driver.crypto import generate_keypair
alice,bob=generate_keypair(),generate_keypair()

# data(asset)
bicycle = {
  'data': {
    'bicycle': {
      'serial_number':'abcd1235',
      'manufacture':'bkfab',
    },
  },
}

# create transaction
creation_tx = bdb.transactions.create(verifying_key=alice.verifying_key,signing_key=alice.signing_key,asset=bicycle)
txid = creation_tx['id']
creation_tx = bdb.transactions.retrieve(txid)

# sleep until transaction done
import time
time.sleep(10)

# transfer transaction
transfer_tx = bdb.transactions.transfer(creation_tx,bob.verifying_key,asset=creation_tx['transaction']['asset'],signing_key=alice.signing_key,)

# print owner
print("owner after BOB ")
print(transfer_tx['transaction']['conditions'][0]['owners_after'][0] == bob.verifying_key)
print("owner before ALICE ")
print(transfer_tx['transaction']['fulfillments'][0]['owners_before'][0] == alice.verifying_key)

# status
print(bdb.transactions.status(creation_tx['id']))


ちなみに、各トランザクションの実行には少し時間がかかりますので、ご了承を。
DBの分散など、その辺は追って確認したいところです。




2016年11月9日水曜日

【雑記】ビットコインとブロックチェーンとFinTechを考える

いろいろ思うことがあるので、この際だからまとめてみようかと。
まだ理解の足りてない部分は多いのですが、こうすることで整理できるかと。

そもそもの注目した部分は、「ブロックチェーン」そのものです。
ブロックチェーンは、単語4つで要約すると「Secure、Shared、Ledger、Distributed」。
分散型管理台帳っていうところでしょうか。
通常、台帳はひとつであり、そのひとつを正とするための管理機構が必要になります。
ブロックチェーンのアイデアは、すべてのノードが同じ台帳を持ち、それらが同じものであることを保証するものです。

ブロックチェーンは、ビットコインを実現するための基盤であり、その論文で説明されています。

ビットコインはProof of Workによってトランザクションを承認しています。
これには「51%攻撃」という脆弱性があり、仕事量の51%を超えるコンピューティングリソースを支配するとブロックチェーンの改ざんが可能となります。
これを解決するために、例えば他の仮想通貨「Ethereum」ではProof of Stake=通貨の保有量に応じてトランザクションを承認する仕組みを取り入れています。
ただし、これらのアルゴリズムが自動で行うにはまだ改善の余地が多いと思われます。

ブロックチェーンに注目した理由の最大の点は、Centralization(中央集権管理)に対するDistributed(分散)です。
今までの人類の歴史は、ほぼすべてが中央集権的な管理体制下での社会であり、その中で少しづつ個人の権利を拡大していく過程でもあります。
合理的、非合理的に関わらず、政府や企業をほぼ無条件で「承認」せざるを得ない仕組みの中で生きてきたはずです。
この技術が確立されれば、その関係性を崩壊させることも可能ではないかという。

パンクでアナーキストですねw
無政府が無秩序にならない技術、とでもいいますか。

ただし、現状のブロックチェーンはProof of Work、Proof of Stake共に仮想通貨である必要があるのかなと。
Workをするインセンティブがどこにあるのか、それが貨幣価値を生むから成り立っている部分もあるのかと思うのでぃす。
そういう意味では、Distributed System を実現させるためのインセンティブの重要性をより深く考える必要がありそうです。

FinTechについて、ブロックチェーン技術と同等に語られることも多いかとは思いますが、
FinTechの核は「確実に回収できる融資」なのかなと考えています。
行動や取引の履歴から融資枠を割り出したり、それを元に迅速に融資を行うなど、どちらかといえば機械学習やDeepLearningの領域なのではないかと。

ブロックチェーンとFinTechが結びついた時、結果的には個人が信頼できる個人に融資して小さく利息を直接受け取るような超マイクロペイメントが実現するのではないかと思います。

今のところこんなところでしょうかね。