Hyperledger Fabric公式ドキュメントのTutorialsを解剖して理解を深める
Tutorialsではfabric-samplesリポジトリ上のシェルスクリプトを実行してノードを起動させたりするのだが、このスクリプトが全部やってくれている感じが強くて何がどうやって動いているのか全く理解できなかった。 そのため実行したシェルスクリプトの内部を読み込んだり必要に応じて手動で実行することで、理解を深めることを目的とする。
なおリポジトリのブランチはmasterだと記事執筆から時間が経過すると動作が変わってしまうことが予想されるため、執筆時点で最新のタグのv2.1.1を利用することにした。 テストネットワークの構築
Fabricのテスト用のネットワークを立ち上げ、チャンネルを作成したりチェインコードを実行しネットワークの動作を確認することができるチュートリアルである。
network.shをざっとみてみる
このテストネットワークで利用するnetwork.shというシェルスクリプトがあるので、まずはこちらの中身をざっとみてみることにする。
実際のコードを見てみると分かるがほとんどは関数でまとめられているため、それぞれについては各操作を見る段階で見ることにする。 ここでは冒頭のコメントと環境変数の設定を見てみる。
# This script brings up a Hyperledger Fabric network for testing smart contracts
# and applications. The test network consists of two organizations with one
# peer each, and a single node Raft ordering service. Users can also use this
# script to create a channel deploy a chaincode on the channel
このシェルスクリプトで構築されるテストネットワークは二つのオーガニゼーションとそれぞれについてのPeer、そしてRaftを用いたOrdering nodeを含んでいる、という旨の記述がされている。
# prepending $PWD/../bin to PATH to ensure we are picking up the correct binaries
# this may be commented out to resolve installed version of tools if desired
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=${PWD}/configtx
export VERBOSE=false
次に環境変数である。各行でそれぞれ、
PATHにfabricのバイナリのディレクトリを追加、
FABRIC_CFG_PATHで設定ファイルのパスを設定、
VERBOSEモードをfalseに設定
している。この辺りはシンプルに理解できる。
テストネットワークの立ち上げ
チュートリアルでは最初に./network.sh upコマンドではPeerノードとOrderingノードの立ち上げを行っている。コマンドとシェルスクリプトを比較すると、スクリプト中のnetworkUp()という関数が実行されていることが分かる。
関数自体は短いとはいえFabric独自の処理をやっている部分なので細かく見ていくことにする。
なお関数内の最初のcheckPrerequsは動作要件の確認なので、今回は無視する。
createOrgsとcreateConsortium
最初に必要なArtifactsが存在しない場合にcreateOrgsとcreateConsortium`が実行される。
なおArtifactsはジェネシスブロックやチャンネルトランザクションなどのネットワークの動作に必要なファイルである。
docker-composeでのノードの立ち上げ
Artifactsの準備ができていれば、関数は次にdocker-composeを利用してノードを立ち上げる。
composeのファイルの中をみると当然の事だがスクリプトのコメントにあったように、二つのオーガニゼーション(のPeer)とOrdererのサービスが定義されている。
#todo 各containerの設定や動作の確認 networkUp関数は大別すると以上の必要なArtifactsの準備とノードの立ち上げを行っているようである。
チャンネルの作成
チャンネルトランザクションの作成
createChannel.shでは最初にcreateChannelTx()が実行される。以降の関数も同様だが、この関数で実際に実行されているのは下記の1コマンドで残りは準備と結果の検証である。
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/${CHANNEL_NAME}.tx -channelID $CHANNEL_NAME
アンカーピアトランザクションの作成
createAncorPeerTx()
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/${orgmsp}anchors.tx -channelID $CHANNEL_NAME -asOrg ${orgmsp}
実際のチャンネルの作成
createChannel()
peer channel create -o localhost:7050 -c $CHANNEL_NAME --ordererTLSHostnameOverride orderer.example.com -f ./channel-artifacts/${CHANNEL_NAME}.tx --outputBlock ./channel-artifacts/${CHANNEL_NAME}.block --tls --cafile $ORDERER_CA >&log.txt
オーガニゼーションのチャンネルへの参加
joinChannel()
peer channel join -b ./channel-artifacts/$CHANNEL_NAME.block >&log.txt
アンカーピアのアップデート
updateAnchorPeers()
peer channel update -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA >&log.txt