1年目エンジニアがHyperledger-Fabricのサンプルを触ってみた！（ネットワーク設定編2）

#はじめに
文系出身エンジニアです。1年目です。

Blockchainに携わることとなり、とりあえずHyperledgerのサンプルアプリでも動かしてみようか、という次第でこの記事を書いてます。
ただの作業ログだと思って見てください。

こちらの記事は、以下の記事の続編です。
[**1年目エンジニアがHyperledger-Fabricのサンプルを触ってみた！（準備編）**](https://qiita.com/wakiwaki/items/c3cd98613fe79f0bc86f)
[**1年目エンジニアがHyperledger-Fabricのサンプルを触ってみた！（ネットワーク設定編1）**]
(https://qiita.com/wakiwaki/items/a6a6ec0a85d520a833b6)

以下のチュートリアルに沿って、fabric-sampleの中のfirst-networkというサンプルを用いて、ブロックチェーンネットワークの設定を行います。
[**Building Your First Network**](https://hyperledger-fabric.readthedocs.io/en/release-1.4/build_network.html)

#環境
- ホストOS：MacOS(v10.13.6)
- ゲストOS：VirtualBox(v5.2.22)上に構築したUbuntu(v16.04.5)

- Hyperledger Fabric v1.4.0

- Docker 18.09.1
- Docker Compose 1.8.0
- go1.6.2
- Python 2.7.12
- Node.js v10.15.0
- npm 6.5.0

#この記事では
SSHを使って、ホストOS：からゲストOSに接続していますが、この記事では後半からコンテナに入ってコマンドを操作することがあります。
なので、混乱しないように、コマンドの戦闘の記号で区別をつけます。

| 先頭の記号|操作してる場所 |
|:-----------------|:------------------|
|$|ゲストOS|
|#|コンテナ内|

#ネットワーク起動
- [**前回**](https://qiita.com/wakiwaki/items/a6a6ec0a85d520a833b6)ダウンロードしたイメージを参照、生成したgenesis.blockを利用して、ネットワークを立ち上げる

```
$ docker-compose -f docker-compose-cli.yaml up -d
Creating network "net_byfn" with the default driver
Creating volume "net_peer0.org2.example.com" with default driver
Creating volume "net_peer1.org2.example.com" with default driver
Creating volume "net_peer1.org1.example.com" with default driver
Creating volume "net_peer0.org1.example.com" with default driver
Creating volume "net_orderer.example.com" with default driver
Creating peer0.org1.example.com
Creating peer1.org2.example.com
Creating peer0.org2.example.com
Creating peer1.org1.example.com
Creating orderer.example.com
Creating cli
```

- パスを通す

```
$ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
$ CORE_PEER_ADDRESS=peer0.org1.example.com:7051
$ CORE_PEER_LOCALMSPID="Org1MSP"
$ CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
```



##チャンネルの作成とjoin
以下の手順から、コンテナに入ります。
私は別のタブで操作してました。
- CLIコンテナに入る

```
$ docker exec -it cli bash
```

表示が以下のようになります
```
root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#
```

- パスを通す

```
# export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
# export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
# export CORE_PEER_LOCALMSPID="Org1MSP"
# export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
# export CHANNEL_NAME=mychannel
```

- チャンネルを作る
以下では、`-c`オプションでチャネル名を指定しています。
`$CHANNEL_NAME`は上記`# export CHANNEL_NAME=mychannel`で指定しています。

-fオプションででPeer用のChannel設定ファイルを指定します。

-oオプションで、Ordererの名前とホスト名を指定しています。

```
# peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
2019-01-10 04:16:32.288 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-01-10 04:16:32.346 UTC [cli.common] readBlock -> INFO 002 Received block: 0
```

- peer0.org1.example.comをchannnelに入れる

-b オプションで、Channel作成時に取得したファイルを指定します。

```
# peer channel join -b mychannel.block
2019-01-10 04:21:01.683 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-01-10 04:21:01.764 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
```

- peer0.org2.example.comをchannnelに入れる

```
# CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
# CORE_PEER_ADDRESS=peer0.org2.example.com:7051 
# CORE_PEER_LOCALMSPID="Org2MSP" 
# CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

#peer channel join -b mychannel.block
2019-01-10 04:22:14.005 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-01-10 04:22:14.083 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
```



##アンカーピアを定義

[アンカーピアとは](https://www.ibm.com/developerworks/jp/cloud/library/cl-hyperledger-fabric-basic-2/index.html)
>Anchor Peer はブロックチェーンネットワーク上の他の組織の Peer との通信の窓口となる Peer のことを言います。 各組織の Anchor Peer のアドレスはブロックチェーンネットワークの起動時に受け取ることができるので、Anchor Peer を通じて各組織の持つ Peer の情報を知ることができます。

- Org1のアンカーピアをpeer0.org1.example.comとして定義

```
# peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
2019-01-10 04:24:25.817 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-01-10 04:24:25.895 UTC [channelCmd] update -> INFO 002 Successfully submitted channel update
```

- Org2のアンカーピアをpeer0.org2.example.comとして定義

```
# CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
# CORE_PEER_ADDRESS=peer0.org2.example.com:7051 
# CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 

#peer channel update -o orderer.example.com:7050 -c CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

2019-01-10 06:35:24.520 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-01-10 06:35:24.584 UTC [channelCmd] update -> INFO 002 Successfully submitted channel update
```



#chaincodeをインストール＆インスタンス化（Node.js ver）

チェーンコードのインスタンス化とは
>簡単に言うと、チェーンコードを使えるようにすること

- チャンネルでNode.jsのchaincodeをインストール（Org1）

```
# peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/chaincode_example02/node/
2019-01-10 04:27:43.263 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-01-10 04:27:43.265 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2019-01-10 04:27:43.281 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" >
```

- チャンネルでNode.jsのchaincodeをインストール（Org2）

```
# CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
# CORE_PEER_ADDRESS=peer0.org2.example.com:7051
# CORE_PEER_LOCALMSPID="Org2MSP"
# CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
```

- ソースコードをPeerのファイルシステムに置く

```
# peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/chaincode_example02/node/
2019-01-10 04:31:25.686 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-01-10 04:31:25.690 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2019-01-10 04:31:25.698 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" >
```

- チャンネルのチェーンコードをインスタンス化

Node.js版は少し時間がかかるそうです。
私は1分少々かかりました。

```
# peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -l node -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
2019-01-10 04:35:07.399 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-01-10 04:35:07.400 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
```

#まとめ
ネットワークを立ち上げてCLIコンテナに入り、コンテナ側の設定と、チェーンコードをインスタン化して、使えるようになりました。

次回は、チェーンコードの実行（query&invoke）を行い、通貨のやり取りに見立てたデモを動かしてみます。