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の分散など、その辺は追って確認したいところです。




0 件のコメント: