BBc−1 version1.0っていうのをリリースしました（４）

[前回](https://qiita.com/quvox/items/87132694c0b74338d674)はトランザクション登録までの流れについて書きました。細かい話に行く前に、今回はBBc-1のgithubリポジトリのドキュメントやソースコードの構成などについて書きます。

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


何はさておき[ここ](https://github.com/beyond-blockchain/bbc1)をcloneしてみてください。

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

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

# ドキュメント類

全体概要や使い方、プログラミング方法については、[docs/ディレクトリ](https://github.com/beyond-blockchain/bbc1/tree/develop/docs)の中にPDFやmarkdownが入っています。

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

* BBc憲章 https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc-trust_ja.pdf
* BBc1設計書 https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc1_design_document_v1.0_ja.pdf
* ホワイトペーパー(英語) https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc-1_design_paper.pdf
* 分析論文(英語) https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc-1_analysis.pdf

### BBc-1コアの使い方、設定方法
* インストール方法 https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc1_core_tutorial_installation_ja.md
* 使い方 https://github.com/beyond-blockchain/bbc1/blob/develop/docs/How_to_use_BBc1_v1.0_ja.pdf
* ネットワーク設定方法(英語) https://github.com/beyond-blockchain/bbc1/blob/develop/docs/how_to_use_in_nat_environment.md
* Windowsでのビルド https://github.com/beyond-blockchain/bbc1/blob/develop/docs/libbbcsig_dll_build_for_Windows_x64_ja.md

### サンプルアプリの使い方
* file_proofの使い方 https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc1_core_tutorial_file_proof_ja.md

### プログラミングガイド
* クライアントアプリの作り方 https://github.com/beyond-blockchain/bbc1/blob/develop/docs/BBc1_programming_guide_v1.0_ja.md
* APIドキュメント　https://bbc-1.readthedocs.io/en/latest/bbc1.html

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

```sh
sh prepare-apidoc.sh
```

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

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

### BBc-1コアの動作仕様
* https://github.com/beyond-blockchain/bbc1/blob/develop/docs/How_BBc1_works_v1.0_ja.pdf

# プログラムの構成
BBc-1を利用する上で重要なソースファイル(モジュール)は3つあります。[前回](https://qiita.com/quvox/items/87132694c0b74338d674)の記事にこんな図を書きました。

![プロセス図.png](https://qiita-image-store.s3.amazonaws.com/0/166000/53911152-679c-5d60-6e27-dfd64016a309.png)

このなかの、coreプロセスというのは、[bbc1/core/ディレクトリ](https://github.com/beyond-blockchain/bbc1/tree/develop/bbc1/core)の下にある、**bbc_core.py**というプログラムを起動することでスタートします。

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

これら2つのプログラムがともに利用しているモジュールが、同じくbbc1/core/ディレクトリの下にある**bbclib.py**です。このモジュールは[前回](https://qiita.com/quvox/items/87132694c0b74338d674)示したようなトランザクションのデータ構造を定義しています。つまり、このモジュールは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することになります。

```python
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](https://github.com/beyond-blockchain/bbc1/blob/develop/examples/file_proof/file_proof.py)というサンプルアプリケーションが含まれます。このサンプルはBBc-1の大半の機能を利用したアプリケーションになっています。このソースコードは、examples/file_proof/file_proof.py にあります。

## その他のコア機能群（普段は気にする必要はない）

[bbc1/core/ディレクトリ](https://github.com/beyond-blockchain/bbc1/tree/develop/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

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


## ライブラリ群

BBc-1のコアリポジトリから分離した形で、複数の[関連ライブラリ](https://github.com/beyond-blockchain)もgithubに公開しています。

* トークンを作るためのライブラリ
  * https://github.com/beyond-blockchain/bbc1-lib-tokens
* 公開鍵と識別子を分離するためのライブラリ
  * https://github.com/beyond-blockchain/bbc1-lib-std
* BBc-1のトランザクションのマークル木をEthereumに打ち込むための機能のライブラリ
  * https://github.com/beyond-blockchain/ledger_subsystem
* BBc-1のサンプルアプリ（file_proof以外）
  * https://github.com/beyond-blockchain/examples

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

# まとめ

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

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

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

```sh
cd bbc1/
sh prepare.sh
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
prepare.shの中でOpenSSLという暗号処理のライブラリをダウンロードしてコンパイルしています。そこそこ時間がかかるので、気長にお待ち下さい。

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

```sh
python3 -m venv venv
source venv/bin/activate
pip install bbc1
```
これでBBc-1関連モジュールがインストールされます（これも内部でOpenSSLのコンパイルが走るので時間が少しかかります）。coreプロセスの起動は

```sh
bbc_core.py --no_nodekey
```
※ no_nodekeyをしてしない場合はノード鍵の生成と登録が必要です。詳しくは[こちら](https://github.com/beyond-blockchain/bbc1/blob/develop/docs/How_to_use_BBc1_v1.0_ja.pdf)の13ページ以降を参照ください。

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

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


### 関連記事

[BBc−1のアプリケーションプログラミング](https://qiita.com/quvox/items/ee14b019b3ba38fd1ab5)
[BBc−1 version1.0っていうのをリリースしました（５）](https://qiita.com/quvox/items/aaf3229b34a2010821cc)
[BBc−1 version1.0っていうのをリリースしました（３）](https://qiita.com/quvox/items/87132694c0b74338d674)
[BBc−1 version1.0っていうのをリリースしました（２）](https://qiita.com/quvox/items/4a8271c46b3a73a16a33)
[BBc−1 version1.0っていうのをリリースしました（１）](https://qiita.com/quvox/items/b54ea50b890ed928dd2f)