Hyperledger Fabric v1.0 の構築からfirst-networkを動作させるまで

最近人気のブロックチェーンについて、調べたことを備忘録として纏めてみました。

# はじめに
**ブロックチェーン**（英語: Blockchain）とは、データベースのトランザクションをブロックという単位にして、それぞれのブロックにハッシュ値を埋め込む（チェーン状に繋いだ）形式でデータの整合性・改ざん防止を図った分散型データベース（ブロックチェーンデータベース）です。
ブロックチェーンデータベースは、Hadoop(HDFS)などの分散型ファイルシステムと異なり、Peer to Peerネットワーク(P2Pネットワーク)でサーバの設置拠点を意識することなく、データを自立的に管理することができます。

ブロックチェーンの詳しい説明は、[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3)などを確認ください。

### 代表的なブロックチェーン基盤
オープンソースのブロックチェーン基盤はいくつかあり代表的なブロックチェーン基盤を簡単に紹介します。

[**Bitcoin Core（旧:Bitcoin-Qt）**](https://bitcoin.org/en/bitcoin-core/)
[ビットコイン](https://bitcoinfoundation.org/)（仮想通貨）の中核で仮想通貨の支払いやコインに特化しているブロックチェーンです。

[**Ethereum**](https://www.ethereum.org/foundation)
Bitcoin Coreが仮想通貨に特化しているのに対して、Ethereumは、汎用的なブロックチェーンを構築可能としています。
なお、Ethereumのスマートコントラクトは、JavaScriptとよく似た高級言語：Solidityで記述します。


[**Hyperledger Fabric**](https://www.hyperledger.org/projects/fabric)
Hyperledger Fabricは、アプリケーションやソリューションを開発するための基盤として、コンセンサスやメンバーシップサービスなどのコンポーネントをプラグアンドプレイできます。
Hyperledger Fabricはコンテナ技術を活用して、システムのアプリケーションロジックを構成し、「チェーンコード」と呼ばれるスマートコントラクトを実装します。
 [Hyperledger Fabric v1.0.0](http://hyperledger-fabric.readthedocs.io/en/latest/releases.html)が2017年7月11日にリリースされた（執筆時点での最新はv1.0.3である）

**その他のブロックチェーン基盤（もしくは類似基盤）**
[Corda](https://www.corda.net/)：R3コンソーシアム主導で開発された金融向けの基盤
[Chain Open Standard 1](https://chain.com/)：企業利用を前提とした機能が特徴
[mijin](http://mijin.io/ja/)：テックビューロ（開発元）のプライベート型ブロックチェーン
[Orb1](https://imagine-orb.com/)：独自の分散型台帳技術「Orb DLT」の開発とその関連Fintechソリューションを提供
[Monax(旧:Eris)](https://monax.io/)：Ethereumから派生したブロックチェーン

※　akitohさんがの記事「[さまざまなブロックチェーン技術](https://qiita.com/akitoh/items/bebf1bf3d71d3e4b96b0)」が自分よりかなり詳しく書かれていたので参考になります。

### 用語について
**ブロック**
ブロックチェーンデータベースのトランザクション郡と１つ前のブロックから生成されたハッシュ値で構成されたデータの単位。

**フォーク**
ブロックチェーンの分岐。分岐したチェーンはいずれどちらかに収束しなければならない。（パブリック型ブロックチェーンのみ）
ソフトフォークとハードフォークの２種類ある。

- ソフトフォーク：ブロックチェーン自体に変更を行わずアカウントやコントラクトを変更させる。
- ハードフォーク：ブロックチェーン自体の内容を巻き戻し、ある時点から再開させる。

**スマートコントラクト**
スマートコントラクトは、その名前の通り、コントラクト（契約）をスマートに行えるプロトコルのことです。つまりスマートコントラクトとは契約の自動化であり、契約の条件確認や履行までを自動的に実行させることができます。
スマートコントラクトは、汎用ブロックチェーンで使用されており、EthereumではSolidity言語，Hyperledger Fabricでは、GO言語やJava言語で記述します。

**コンセンサスアルゴリズム**
分散(P2P)ネットワークのように情報到達にタイムラグがある場合、単一の結果を得るための分散合意形成アルゴリズムです。ブロックチェーンでは、ブロックの正当性を検証しブロックチェーンに反映するために使用します。

- Proof of Work(PoW)アルゴリズム
計算量による証明。参加者は確率的に解答が困難な問題を一番早く解くことができた参加者にブロック作成許可と報酬を与える。

- Proof of Stake(PoS)アルゴリズム
仮想通貨ではより多くコインを所有している参加者が優先的にブロック作成許可を得る。

- Practical Byzantine Fault Tolelance(PBFT)
ネットワークの全ての参加者をあらかじめ知っておき、管理者から全ての参加者へ要求を送ります。その要求に対する結果を集計し、多数を占めている値を採用する。
> コアノードにブロックの生成権限を集中させ、コアノードによる合議制において、トランザクションの承認を行う仕組み

**State Database（ステートＤＢ）**
ブロックチェーンで使用するデータベースのこと。

# Hyperledger Fabric v1.0の環境について

IBM社が提供する「IBM Bluemix」というクラウドサービスにおいて、Blockchainサービス構築のための各種インターフェイスが用意されており、手頃な値段でクラウド上で用意に構築が可能です。
今回は、ローカル環境にHyperledger FabricのDockerコンテナをダウンロードして、Hyperledger FabricのSampleコードを実行する方法を記述します。

### 実行環境
　OS：Red Hat Enterprise Linux 7.2
　Docker：1.13.1
　docker-compose：1.16.1

　※　各プラットフォームによって異なるため、Dockerのインストール手順は割愛します。
 
 # 手順
 Hyperledger Fabric v1.0.2のdockerコンテナをダウンロードし、サンプルプログラムからHyperledger Fabricを起動させるところまで実行します。
 
 1.暗号化(x509)ツールおよびdockerコンテナのダウンロード
 2.fabric-samplesの配備
 3.fabric-samples:first-networkの起動

 #### 1.暗号化(x509)ツールおよびdockerコンテナのダウンロード

暗号化(x509)ツールおよびHyperledger Fabricがインストールされているdockerコンテナをダウンロードします。
 
```command:コマンド
# mkdir /opt/docker
# cd /opt/docker/
# curl -sSL https://goo.gl/Gci9ZX | bash
# chown -R root:root bin
```
Dockerイメージの状態を確認します。

```command:コマンド
# docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
docker.io/hyperledger/fabric-ca          x86_64-1.0.2        7e53be14f804        4 weeks ago         238.3 MB
hyperledger/fabric-ca                    latest              7e53be14f804        4 weeks ago         238.3 MB
docker.io/hyperledger/fabric-tools       x86_64-1.0.2        ba9750b2565d        4 weeks ago         1.328 GB
hyperledger/fabric-tools                 latest              ba9750b2565d        4 weeks ago         1.328 GB
docker.io/hyperledger/fabric-couchdb     x86_64-1.0.2        3f922f54bd68        4 weeks ago         1.469 GB
hyperledger/fabric-couchdb               latest              3f922f54bd68        4 weeks ago         1.469 GB
hyperledger/fabric-kafka                 latest              0b4b1d249e65        4 weeks ago         1.286 GB
docker.io/hyperledger/fabric-kafka       x86_64-1.0.2        0b4b1d249e65        4 weeks ago         1.286 GB
docker.io/hyperledger/fabric-zookeeper   x86_64-1.0.2        1efb063147d3        4 weeks ago         1.301 GB
hyperledger/fabric-zookeeper             latest              1efb063147d3        4 weeks ago         1.301 GB
docker.io/hyperledger/fabric-orderer     x86_64-1.0.2        6efd17e86e65        4 weeks ago         151.2 MB
hyperledger/fabric-orderer               latest              6efd17e86e65        4 weeks ago         151.2 MB
docker.io/hyperledger/fabric-peer        x86_64-1.0.2        0e2ed51971c9        4 weeks ago         154.1 MB
hyperledger/fabric-peer                  latest              0e2ed51971c9        4 weeks ago         154.1 MB
docker.io/hyperledger/fabric-javaenv     x86_64-1.0.2        0be45dbd7ff4        4 weeks ago         1.414 GB
hyperledger/fabric-javaenv               latest              0be45dbd7ff4        4 weeks ago         1.414 GB
docker.io/hyperledger/fabric-ccenv       x86_64-1.0.2        d0f166e1a89e        4 weeks ago         1.282 GB
hyperledger/fabric-ccenv                 latest              d0f166e1a89e        4 weeks ago         1.282 GB
docker.io/hyperledger/fabric-baseos      x86_64-0.3.2        bbcbb9da2d83        5 weeks ago         128.8 MB
```

暗号化(x509)ツールをダウンロードした`/opt/docker/bin`を環境変数：PATHに追加します。

####  2.fabric-samplesの配備

GitHubに公開されている[fabric-samples](https://github.com/hyperledger/fabric-samples)をダウンロードします。任意のディレクトリに配備します。

####  3.fabric-samples:first-networkの起動

fabric-samples:first-networkの証明書の作成およびfirst-networkの起動をします。

```command:コマンド
# cd [任意のディレクトリ]/fabric-samples-release/first-network/
# ./byfn.sh -m generate
# ./byfn.sh -m up
```

以下のメッセージが表示され、正常にHyperledger Fabricが起動したことを確認する。

```
========= All GOOD, BYFN execution completed ===========

_____   _   _   ____
| ____| | \ | | |  _ \
|  _|   |  \| | | | | |
| |___  | |\  | | |_| |
|_____| |_| \_| |____/
```

`docker ps`コマンドにて、Dockerコンテナの実行状態を確認します。

```
# docker ps
CONTAINER ID        IMAGE                                                                                                  COMMAND                  CREATED              STATUS              PORTS                                              NAMES
cca60322ac63        dev-peer1.org2.example.com-mycc-1.0-26c2ef32838554aac4f7ad6f100aca865e87959c9a126e86d764c8d01f8346ab   "chaincode -peer.addr"   40 seconds ago       Up 38 seconds                                                          dev-peer1.org2.example.com-mycc-1.0
7399010a74d5        dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9   "chaincode -peer.addr"   About a minute ago   Up About a minute                                                      dev-peer0.org1.example.com-mycc-1.0
c094f9b95262        dev-peer0.org2.example.com-mycc-1.0-15b571b3ce849066b7ec74497da3b27e54e0df1345daff3951b94245ce09c42b   "chaincode -peer.addr"   About a minute ago   Up About a minute                                                      dev-peer0.org2.example.com-mycc-1.0
2b79531a74e5        hyperledger/fabric-tools                                                                               "/bin/bash -c './scri"   2 minutes ago        Up 2 minutes                                                           cli
eb1c70cf917b        hyperledger/fabric-peer                                                                                "peer node start"        3 minutes ago        Up 2 minutes        0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp     peer1.org1.example.com
fce3b9141d56        hyperledger/fabric-orderer                                                                             "orderer"                3 minutes ago        Up 2 minutes        0.0.0.0:7050->7050/tcp                             orderer.example.com
4c158b7b078f        hyperledger/fabric-peer                                                                                "peer node start"        3 minutes ago        Up 2 minutes        0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp     peer0.org1.example.com
14e532038e48        hyperledger/fabric-peer                                                                                "peer node start"        3 minutes ago        Up 2 minutes        0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp   peer1.org2.example.com
a74783dd25e6        hyperledger/fabric-peer                                                                                "peer node start"        3 minutes ago        Up 2 minutes        0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp     peer0.org2.example.com
```

fabric-samples:first-networkの停止は以下のコマンドを実行します。

```command:コマンド
# ./byfn.sh -m down
```

# 最後に

今回は、docker コンテナのダウンロードから起動までの手順を記載しました。
各手順は、Hyperledger Fabricの公式ドキュメントに記載されているので、詳細はそちらを参照ください。

[Hyperledger Fabric チュートリアル:First Network](http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html)