編集リクエストくださった方、ありがとうございます。
注意 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の再ビルドが必要なので、以下の手順になる。
- 環境設定
- Fabric v1.1.0のソースをクローンする
- Fabricをビルドする
- テスト用設定およびスクリプトファイルを書き換える
- 実行してみる
環境設定
公式のドキュメントを見てほしい。v0.6やv1.0で開発していた人が注意するべきは以下:
- Goのバージョンは1.9+に変更になっている
- Node.jsのバージョンが8.xに変更になっている。9.xだと動かないそうなので注意
-
libtool
をbrew install libtool
でインストールすること。これがないとPKCS11関連のコードのビルドでエラーになる
あと既存のDockerイメージは一旦消しておくとよい:
docker rmi -f $(docker images -q)
以下、作業ディレクトリを$WORK
で表わす。
Fabric v1.1.0のソースをクローンする
ビルド時に各ソースはGoのパッケージとして扱われるため、それに従ってディレクトリを掘る必要がある。
クローンの際、ブランチにrelease-1.1
を指定するのがポイントである。
注意: タグv1.1.0
をクローンするのは、いくつかのファイルが古いのでうまくいかない
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
でビルドすることは避けた。
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