【Obsolete】Hyperledger Fabric v1.1.0で実験的機能のprivate ledgerを試す

> 編集リクエストくださった方、ありがとうございます。

---

> **注意** v1.2.0ではPDC (Private Data Collection) として正式採用になったため、素直に公式のdockerイメージを使うのが吉です。こちらは参考資料として残しておきます。

# Private ledger機能とは

一部の参加者だけでデータを共有するための "private state DB" などを導入する機能である。共有の単位を**コレクション**と呼び、あるコレクションは決められた組織のメンバだけで共有される。Private state DBにはプライベートなデータが生で格納され、これまでのstate DBにはデータ (キーおよび値) のハッシュ値だけが記録される仕組みである。

[参考] チャネルとは異なる機能である。チャネルはそれぞれが論理的に分離されたFabricのネットワークとみなされるので、相異なるチャネル間のトランザクションの順序などは合意されないし、チャネル間でデータを受け渡ししようとすると2トランザクション必要なので、原子性が保証されない。Private ledgerでは、さすがにendorserはコレクションにアクセス可能なノードしかなれないが、複数のコレクションをまたぐデータ移動も1トランザクションで記述でき、コミット時の検証はすべてのピアで行える。

Private ledger機能はv1.1ではexperimental機能であり、v1.2で正式採用される予定である。

# 実験方法

Mac OS X El Capitanで試した。Linuxの場合はUbuntu 16.04がおすすめ。Windowsの場合はVirtualBoxでUbuntuのVMを作ってその中で試すのがおすすめ。

v1.1で試すにはFabricの再ビルドが必要なので、以下の手順になる。

1. 環境設定
1. Fabric v1.1.0のソースをクローンする
2. Fabricをビルドする
3. テスト用設定およびスクリプトファイルを書き換える
4. 実行してみる

## 環境設定

公式のドキュメントを見てほしい。v0.6やv1.0で開発していた人が注意するべきは以下:

- Goのバージョンは1.9+に変更になっている
- Node.jsのバージョンが8.xに変更になっている。9.xだと動かないそうなので注意
- `libtool`を`brew install libtool`でインストールすること。これがないとPKCS11関連のコードのビルドでエラーになる

あと既存のDockerイメージは一旦消しておくとよい:

```bash
docker rmi -f $(docker images -q)
```

以下、作業ディレクトリを`$WORK`で表わす。

## Fabric v1.1.0のソースをクローンする

ビルド時に各ソースはGoのパッケージとして扱われるため、それに従ってディレクトリを掘る必要がある。
クローンの際、ブランチに`release-1.1`を指定するのがポイントである。
**注意: タグ`v1.1.0`をクローンするのは、いくつかのファイルが古いのでうまくいかない**

```bash
cd $WORK

# GOPATHを設定。フルパスで指定するのに注意
export GOPATH=$(pwd)

mkdir -p src/github.com/hyperledger
cd src/github.com/hyperledger 

# --depth=1 を指定すると過去のコミットを取らないので速い
git clone -b release-1.1 --depth=1 https://github.com/hyperledger/fabric.git
```

## Fabricをビルドする

`EXPERIMENTAL`環境変数を`true`にセットするのがポイント。現在のところテストを通す方法がわかっていないので、`make all`でビルドすることは避けた。

```bash
cd $WORK/src/github.com/hyperledger/fabric
EXPERIMENTAL=true make native docker
```

ビルドでやっていること:

- `fabric-baseimage`などのDockerイメージをpullしてくる。
- `gotools/`以下のツールのビルドを仮想環境内で行っている、たぶん。
- `chaintool`のjarのダウンロード。たぶん`fabric-javaenv`を作るために必要。
- `fabric-javaenv`イメージのビルド。`fabric-baseimage`がベース。
- Platform binaries (`peer`、`orderer`、`configtxgen`、`cryptogen`、`configtxlator`) のホストでのビルド。`build/bin`に作られる。ここで`go install -tags "experimental"`のように`experimental`ビルドタグが指定されていることを確認する。
- `fabric-baseos`イメージのpull。`*-baseimage`と何が違うかは不明。
- `fabric-{peer,orderer,buildenv,testenv,tools}`イメージのビルド。

ビルドが完了すると、いわゆるplatform binariesがbuild/binにでき、以下のDockerイメージが作成される。

```
$ docker images
REPOSITORY                     TAG                             IMAGE ID            CREATED             SIZE
hyperledger/fabric-tools       latest                          979a13131bcd        7 hours ago         1.46GB
hyperledger/fabric-tools       x86_64-1.1.1-snapshot-dfce537   979a13131bcd        7 hours ago         1.46GB
hyperledger/fabric-testenv     latest                          a809230a592f        7 hours ago         1.57GB
hyperledger/fabric-testenv     x86_64-1.1.1-snapshot-dfce537   a809230a592f        7 hours ago         1.57GB
hyperledger/fabric-buildenv    latest                          2e4e3ab79105        7 hours ago         1.46GB
hyperledger/fabric-buildenv    x86_64-1.1.1-snapshot-dfce537   2e4e3ab79105        7 hours ago         1.46GB
hyperledger/fabric-orderer     latest                          6dc82bdb5eb9        7 hours ago         180MB
hyperledger/fabric-orderer     x86_64-1.1.1-snapshot-dfce537   6dc82bdb5eb9        7 hours ago         180MB
hyperledger/fabric-peer        latest                          7b517cc7f5cc        7 hours ago         187MB
hyperledger/fabric-peer        x86_64-1.1.1-snapshot-dfce537   7b517cc7f5cc        7 hours ago         187MB
hyperledger/fabric-javaenv     latest                          af34fa1fbbaa        7 hours ago         1.52GB
hyperledger/fabric-javaenv     x86_64-1.1.1-snapshot-dfce537   af34fa1fbbaa        7 hours ago         1.52GB
hyperledger/fabric-ccenv       latest                          af367ff285ca        7 hours ago         1.39GB
hyperledger/fabric-ccenv       x86_64-1.1.1-snapshot-dfce537   af367ff285ca        7 hours ago         1.39GB
hyperledger/fabric-baseimage   x86_64-0.4.6                    dbe6787b5747        2 months ago        1.37GB
hyperledger/fabric-baseos      x86_64-0.4.6                    220e5cf3fb7f        2 months ago        151MB
```

いま気がついたが、`release-1.1`のHEADを使ったのでバージョンが1.1.1になっている。ちなみにタグから`snapshot-...`という表記を消したい場合はMakefileを修正して`IS_RELEASE=true`としてからmakeすること。

なお、本当はビルドしたコードをテストしなければいけないが、なぜか`make unit-test`が通らないのでスキップすることにする。

なお、この状態でpeerコマンドを実行するとこうなる:

```
$ ./build/bin/peer version
peer:
 Version: 1.1.1-snapshot-dfce537
 Go version: go1.10.2
 OS/Arch: darwin/amd64
 Experimental features: true
 Chaincode:
  Base Image Version: 0.4.6
  Base Docker Namespace: hyperledger
  Base Docker Label: org.hyperledger.fabric
  Docker Namespace: hyperledger

2018-05-17 00:43:14.021 JST [main] main -> INFO 001 Exiting.....
```

たしかに、Experimentalフラグがtrueになっている。

## テスト用設定およびスクリプトファイルを書き換える

to be written