Python
ブロックチェーン
bbc1

BBc−1 version1.0っていうのをリリースしました(4)

前回はトランザクション登録までの流れについて書きました。細かい話に行く前に、今回はBBc-1のgithubリポジトリのドキュメントやソースコードの構成などについて書きます。

※ なお、先日公開したversion 1.0のインストールスクリプトに不具合があったようで、pipenvおよびpipによるinstallに失敗するケースがあったようです。修正してv1.0.1っていうのをリリースしました(まだpipenvはうまく行ってないので、pipを使ってください)。ただ、今回の記事はpipを使わずgitから直接cloneしてくるのが前提です。

何はさておきここをcloneしてみてください。

git clone https://github.com/beyond-blockchain/bbc1

BBc-1を使えるようにするための準備方法は、この記事の最後に載せておきます。

ドキュメント類

全体概要や使い方、プログラミング方法については、docs/ディレクトリの中にPDFやmarkdownが入っています。

設計思想などBBc-1の根本に触れたいなら

BBc-1コアの使い方、設定方法

サンプルアプリの使い方

プログラミングガイド

なお、以下のコマンドでもAPIドキュメントページを作成できます。

sh prepare-apidoc.sh

このあと、以下のようにしてローカルにhttpサーバを立ち上げて、ブラウザでhttp://localhost:8000 で閲覧可能です。

cd docs/api/_build/html
python -m http.server

BBc-1コアの動作仕様

プログラムの構成

BBc-1を利用する上で重要なソースファイル(モジュール)は3つあります。前回の記事にこんな図を書きました。

プロセス図.png

このなかの、coreプロセスというのは、bbc1/core/ディレクトリの下にある、bbc_core.pyというプログラムを起動することでスタートします。

一方appプロセスの方は、同じbbc1/core/ディレクトリの下のbbc_app.pyというモジュールの中にあるBBcAppClientクラスのオブジェクトが動作しているプロセスのことです。このクラスが、coreプロセスに対する様々な機能・APIを提供しています。(なお、HTTP Gatewayはまだできていません)

これら2つのプログラムがともに利用しているモジュールが、同じくbbc1/core/ディレクトリの下にあるbbclib.pyです。このモジュールは前回示したようなトランザクションのデータ構造を定義しています。つまり、このモジュールはBBc-1の要と言っても過言ではありません。

bbc_app.pyはかなりlow levelなインタフェースを提供しています。というのもbbc_core.pyからやってくるメッセージをそのまま上位層に中継するような感じになっているためです。そのため、bbc_core.pyのメッセージフォーマットやエラーコードを解釈しなければならないため、message_key_types.pyというモジュールとbbc_error.pyというモジュールも必要になります。(bbc_app.pyをラップするモジュールを作ったほうが良いのかもしれません)

したがって、BBc−1のアプリケーション(スマートコントラクト)を開発する際には、以下のようなモジュールたちをimportすることになります。

from bbc1.core import bbc_app
from bbc1.core import bbclib
from bbc1.core.message_key_types import KeyType
from bbc1.core.bbc_error import *

なお、gitリポジトリには、file_proof.pyというサンプルアプリケーションが含まれます。このサンプルはBBc-1の大半の機能を利用したアプリケーションになっています。このソースコードは、examples/file_proof/file_proof.py にあります。

その他のコア機能群(普段は気にする必要はない)

bbc1/core/ディレクトリの下には他にもいくつかのソースがあります。その中に、もしかしたら将来的には拡張が必要になるかもしれないものがいくつかあります。

data_handler.py

data_handler.pyには、トランザクションおよびトランザクション検索効率化のための情報を管理するDBを操作する機能と、アセットファイル(トランザクション本体とは分離されたデジタル資産)の読み書き機能が実装されています。現在は、ローカルのSQLite3を使うアダプタと、MySQLを使うアダプタが実装されています。MySQLに関しては複数のサーバを指定することも可能ですし、coreノードがそれぞれ別々のMySQLサーバを指定したり、同一のMySQLサーバを指定することも可能になっています。しかし、もし例えばPostgreSQLを使いたいとかであれば、アダプタを作る必要があると思います(SQLの方言を吸収するために)。もしかするとアセットファイルをクラウドに置きたいという要望があれば、WebDav対応させるなどの必要も出てくるかもしれません。(プルリクお待ちしています!)

topology_manager.py

topology_manager.pyには、coreプロセス間の接続を管理する機能が実装されています。現在は、ドメインごとにフルメッシュのトポロジーを形成するようになっています。coreプロセスは複数のドメインを同時に持つことができますが、それぞれ別々の管理なので互いに影響することはないですが、逆に非効率でもあります。そのあたりを改善したり、もしかするとフルメッシュではなく、DHTなどのP2Pアルゴリズムを導入したくなるかもしれません。その場合はここに実装することになります。

domain0_manager.py

まだ説明していませんが、履歴交差という機能を使う際に、ドメイン0というすべてのドメインが参加するグローバルなドメインがあります(履歴交差を使わなければドメイン0を意識する必要はありません)。ドメイン0の接続性の管理は、現時点ではまだフルメッシュしかサポートしていません。P2PアルゴリズムのKademriaを入れたいと思っていますが、それはここに実装することになります。

ライブラリ群

BBc-1のコアリポジトリから分離した形で、複数の関連ライブラリもgithubに公開しています。

まだ発展途上のものも多いので、ご興味のある方は是非ご協力ください。

まとめ

今回は、gitリポジトリの中身について紹介しました。ご興味がありましたら、是非ドキュメントとか読んでみてください。次はアプリ開発で気にすべき点(bbc_app.pyとbbclib.py)を中心に説明しようと考えています。

gitリポジトリのBBc-1を使えるようにするには

READMEに書いてあるように、virtualenv環境を作って、prepare.shを実行する必要があります。Pythonは3.5以降でお願いします。

cd bbc1/
sh prepare.sh
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

prepare.shの中でOpenSSLという暗号処理のライブラリをダウンロードしてコンパイルしています。そこそこ時間がかかるので、気長にお待ち下さい。

ちなみに、pipを使ってBBc-1をインストールする場合は、以下のとおりです。

python3 -m venv venv
source venv/bin/activate
pip install bbc1

これでBBc-1関連モジュールがインストールされます(これも内部でOpenSSLのコンパイルが走るので時間が少しかかります)。coreプロセスの起動は

bbc_core.py --no_nodekey

※ no_nodekeyをしてしない場合はノード鍵の生成と登録が必要です。詳しくはこちらの13ページ以降を参照ください。

としておいて、別ターミナルで、例えばfile_proofを以下の順番で起動すると試せます。

file_proof.py keypair
file_proof.py setup
file_proof.py store <filename>

関連記事

BBc−1のアプリケーションプログラミング
BBc−1 version1.0っていうのをリリースしました(5)
BBc−1 version1.0っていうのをリリースしました(3)
BBc−1 version1.0っていうのをリリースしました(2)
BBc−1 version1.0っていうのをリリースしました(1)