チェーンコードがワールドステートにKVS情報を登録する際、デフォルトでは平文で登録される。
Fabricが提供するチェーンコード関数(shim)において、暗号化・復号化関数を使ってKVS情報を暗号化・復号化してみる。
➀最初に、必要なパッケージをgovendorでインストールする。
# cd /opt/src/github.com/hyperledger/fabric-samples/chaincode/enccc_example
# go get github.com/kardianos/govendor
# govendor init
# govendor add +external
# ls -l vendor/
合計 44
drwxr-xr-x. 22 root root 4096 12月 24 16:06 github.com
drwxr-xr-x. 5 root root 47 12月 24 16:06 go.uber.org
drwxr-xr-x. 3 root root 15 12月 24 16:06 golang.org
drwxr-xr-x. 4 root root 34 12月 24 16:06 google.golang.org
drwxr-xr-x. 3 root root 21 12月 24 16:06 gopkg.in
-rw-r--r--. 1 root root 39682 12月 24 16:06 vendor.json
②チェーンコードをインストールする。ここでは、Fabric付属のサンプルソースを利用する。
#peer chaincode install -n bushido -v 1.0 -l golang -p github.com/chaincode/enccc_example
#
# peer chaincode instantiate -o orderer.example.com:7050 -C bushido -n bushido -l golang -v 1.0 -c '{"Args":[]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')" --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
③共通鍵を作成する。サポートしてる暗号アルゴリズムはAES 256bit。
# ENCKEY=`openssl rand 32 -base64` && DECKEY=$ENCKEY
# echo $ENCKEY
hVhA7CxStLauw9/aLBnieoC9dM237fQHPvU8ibS1MyY=
#
# IV=`openssl rand 16 -base64`
➃データを暗号化してワールドステートに登録する。
transientオプションに暗号化鍵を指定する。暗号化鍵はワールドステートには登録されない。
# peer chaincode invoke -n bushido -C bushido -c '{"Args":["ENCRYPT","key2","value2"]}' --transient "{\"ENCKEY\":\"$ENCKEY\",\"IV\":\"$IV\"}" --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
⑤復号化してワールドステートから値を取得する。
transientオプションに復号化鍵(=暗号化鍵)を指定する。
# peer chaincode query -n bushido -C bushido -c '{"Args":["DECRYPT","key2"]}' --transient "{\"DECKEY\":\"$DECKEY\"}"
value2
ためしに、復号化鍵(DECKEY)に誤った値を指定した場合、以下のエラーが発生する。
・hogeとした場合
# peer chaincode query -n bushido -C bushido -c '{"Args":["DECRYPT","key2"]}' --transient "{\"DECKEY\":\"hoge\"}"
failed: Failed importing key with opts [&{true}]: Invalid Key Length [3]. Must be 32 bytes"
・32バイトの適用な値を指定した場合
# peer chaincode query -n bushido -C bushido -c '{"Args":["DECRYPT","key2"]}' --transient "{\"DECKEY\":\"111222xStLauw9/aLBnieoC9dM237fQHPvU8ibS1MyY=\"}"
Error: endorsement failure during query. response: status:500 message:"getStateAndDecrypt failed, err Invalid pkcs7 padding (unpadding > aes.BlockSize || unpadding == 0)\nFailed decrypting with opts [&{[] <nil>}]\ngithub.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/bccsp/sw.(*CSP).Decrypt\n\t/chaincode/input/src/github.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/bccsp/sw/impl.go:303\ngithub.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim/ext/entities.(*BCCSPEncrypterEntity).Decrypt\n\t/chaincode/input/src/github.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim/ext/entities/entities.go:246\nmain.getStateAndDecrypt\n\t/chaincode/input/src/github.com/chaincode/enccc_example/utils.go:40\nmain.(*EncCC).Decrypter\n\t/chaincode/input/src/github.com/chaincode/enccc_example/enccc_example.go:76\nmain.(*EncCC).Invoke\n\t/chaincode/input/src/github.com/chaincode/enccc_example/enccc_example.go:182\ngithub.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim.(*Handler).handleTransaction.func1\n\t/chaincode/input/src/github.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim/handler.go:273\nruntime.goexit\n\t/opt/go/src/runtime/asm_amd64.s:1333"
2018年12月24日月曜日
2018年12月9日日曜日
Fabric Javaチェーンコードをつかってみる
Hyperledger Fabric 1.3から、Java版チェーンコードが正式サポートされた。
Java版チェーンコードを使ってみる。
Javaチェーンコードを利用する際の前提条件は以下のとおり。
・JDK 1.8がインストール済みであること。
・gradle 2.12以上がインストール済みであること。
➀各PeerにJavaチェーンコードをインストールする。
※Fabricでは、Javaチェーンコードのサンプルが提供されており、今回はそれを利用する。
# peer chaincode install -n bushido -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/
#
# CORE_PEER_ADDRESS="peer0.org2.example.com:7051"
# CORE_PEER_LOCALMSPID="Org2MSP"
# CORE_PEER_MSPCONFIGPATH="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp"
# CORE_PEER_TLS_CERT_FILE="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.crt"
# CORE_PEER_TLS_KEY_FILE="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.key"
# 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 chaincode install -n bushido -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/
②チェーンコードのinstantiateを行う。
# peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt -C bushido -n bushido -l java -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
Java版チェーンコードを使ってみる。
Javaチェーンコードを利用する際の前提条件は以下のとおり。
・JDK 1.8がインストール済みであること。
・gradle 2.12以上がインストール済みであること。
➀各PeerにJavaチェーンコードをインストールする。
※Fabricでは、Javaチェーンコードのサンプルが提供されており、今回はそれを利用する。
# peer chaincode install -n bushido -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/
#
# CORE_PEER_ADDRESS="peer0.org2.example.com:7051"
# CORE_PEER_LOCALMSPID="Org2MSP"
# CORE_PEER_MSPCONFIGPATH="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp"
# CORE_PEER_TLS_CERT_FILE="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.crt"
# CORE_PEER_TLS_KEY_FILE="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.key"
# 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 chaincode install -n bushido -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/
②チェーンコードのinstantiateを行う。
# peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt -C bushido -n bushido -l java -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
③Javaチェーンコードのコンテナが作成されていることを確認する。
# docker ps | grep bushido
84bb5c2aa994 dev-peer0.org1.example.com-bushido-1.0-92aca216667084484fba82d74149bf26ec36672612d5608a67bb2b0694ade7d7 "/root/chaincode-jav…" 5 minutes ago Up 5 minutes dev-peer0.org1.example.com-bushido-1.0
➃QUERYやINVOKEを行うことができることを確認する。
# peer chaincode query -C bushido -n bushido -c '{"Args":["query","a"]}'
100
# peer chaincode query -C bushido -n bushido -c '{"Args":["query","b"]}'
200
<補足>
Javaチェーンコードのログを閲覧すると、以下のようなログが出力される。
[root@localhost first-network]# docker logs -f --tail 30 dev-peer0.org1.example.com-bushido-1.0
Dec 09, 2018 3:43:12 AM org.hyperledger.fabric.shim.ChaincodeBase newChannelBuilder
INFO: Configuring channel connection to peer.
Dec 09, 2018 3:43:14 AM org.hyperledger.fabric.example.SimpleChaincode init
INFO: Init java simple chaincode
Dec 09, 2018 3:43:14 AM org.hyperledger.fabric.example.SimpleChaincode init
INFO: account a, value = 100; account b, value 200
Dec 09, 2018 3:45:52 AM org.hyperledger.fabric.example.SimpleChaincode invoke
INFO: Invoke java simple chaincode
Dec 09, 2018 3:45:52 AM org.hyperledger.fabric.example.SimpleChaincode query
INFO: Query Response:
Name: a, Amount: 100
Dec 09, 2018 3:45:57 AM org.hyperledger.fabric.example.SimpleChaincode invoke
INFO: Invoke java simple chaincode
Dec 09, 2018 3:45:57 AM org.hyperledger.fabric.example.SimpleChaincode query
INFO: Query Response:
Name: a, Amount: 100
Dec 09, 2018 3:46:03 AM org.hyperledger.fabric.example.SimpleChaincode invoke
INFO: Invoke java simple chaincode
Dec 09, 2018 3:46:03 AM org.hyperledger.fabric.example.SimpleChaincode query
INFO: Query Response:
Name: a, Amount: 100
Dec 09, 2018 3:46:52 AM org.hyperledger.fabric.example.SimpleChaincode invoke
INFO: Invoke java simple chaincode
Dec 09, 2018 3:46:52 AM org.hyperledger.fabric.example.SimpleChaincode query
INFO: Query Response:
Name: b, Amount: 200
Hyperledger Fabric バッチサイズ変更手順
FabricのOrdererがブロックを生成する際、デフォルト設定では、以下のタイミングでブロックが作られる。
タイムアウト時間:2秒
または
トランザクション数:10個
ブロックチェーンコンソーシアムを構築した後、運用中にトランザクション数を変更する手順を説明する。
➀CONFIGブロックを取得する。
# docker exec -it cli bash
# peer channel fetch config config.bc -o orderer.example.com:7050 -c bushido --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt
②CONFIGブロック(バイナリ)をJSON形式にデコードする。このとき、Envelopeメッセージ等は除外する。
# configtxlator proto_decode --input config.bc --type common.Block | jq .data.data[0].payload.data.config > config.json
③今回はトランザクション数を10→5に変更することにする。
# jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count" "config.json"
10
# jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count = 5" "config.json" > "update_config.json"
# jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count" "update_config.json"
5
➃「config.json」と「update_config.json」の差分値をシミレーションする。
#configtxlator proto_encode --input config.json --type common.Config > config.bc
#configtxlator proto_encode --input update_config.json --type common.Config > update_config.bc
#configtxlator compute_update --channel_id bushido --original config.bc --updated update_config.bc --output update_config_2.bc
⑤シミレーション結果で生成された「update_config_2.bc」をJSON形式にデコードする。
#configtxlator proto_decode --input update_config_2.bc --type common.ConfigUpdate | jq . > update_config_2.json
⑥Envelopeメッセージをラッピングする。
#echo '{"payload":{"header":{"channel_header":{"channel_id":"bushido", "type":2}},"data":{"config_update":'$(cat update_config_2.json)'}}}' | jq . > update_config_2_envelope.json
タイムアウト時間:2秒
または
トランザクション数:10個
ブロックチェーンコンソーシアムを構築した後、運用中にトランザクション数を変更する手順を説明する。
➀CONFIGブロックを取得する。
# docker exec -it cli bash
# peer channel fetch config config.bc -o orderer.example.com:7050 -c bushido --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt
②CONFIGブロック(バイナリ)をJSON形式にデコードする。このとき、Envelopeメッセージ等は除外する。
# configtxlator proto_decode --input config.bc --type common.Block | jq .data.data[0].payload.data.config > config.json
③今回はトランザクション数を10→5に変更することにする。
# jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count" "config.json"
10
# jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count = 5" "config.json" > "update_config.json"
# jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count" "update_config.json"
5
➃「config.json」と「update_config.json」の差分値をシミレーションする。
#configtxlator proto_encode --input config.json --type common.Config > config.bc
#configtxlator proto_encode --input update_config.json --type common.Config > update_config.bc
#configtxlator compute_update --channel_id bushido --original config.bc --updated update_config.bc --output update_config_2.bc
⑤シミレーション結果で生成された「update_config_2.bc」をJSON形式にデコードする。
#configtxlator proto_decode --input update_config_2.bc --type common.ConfigUpdate | jq . > update_config_2.json
⑥Envelopeメッセージをラッピングする。
#echo '{"payload":{"header":{"channel_header":{"channel_id":"bushido", "type":2}},"data":{"config_update":'$(cat update_config_2.json)'}}}' | jq . > update_config_2_envelope.json
⑦「update_config_2_envelope.json」をバイナリ形式にエンコードする。
#configtxlator proto_encode --input update_config_2_envelope.json --type common.Envelope --output update_config_2_envelope.bc
⑧「update_config_2_envelope.bc」に対して、PEERの署名を行う。
(Endorsing Policyを満たす分、署名を付与する必要あり)
# peer channel signconfigtx -f update_config_2_envelope.bc
⑨チャネルを更新する。
# peer channel update -f update_config_2_envelope.bc -c bushido -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt
# peer channel update -f update_config_2_envelope.bc -c bushido -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt
2018年8月19日日曜日
Hyperledger Fabric 1.2.0 Release版 インストール
インストールの流れは、1.1.0 Release版とほぼ同じである。
v1.1.0 Release版の手順は以下を参照。
http://memoyasu.blogspot.com/2018/04/hyperledger-fabric-110relase.html
1.1.0と1.2.0の手順の差分は以下。
①Fabaricソース一式をクローンする際、ブランチ名を変更すること。
# git clone -b v1.2.0 https://github.com/hyperledger/fabric.git
# git clone -b v1.2.0 https://github.com/hyperledger/fabric-ca.git
②サードパーティDockerイメージをダウンロードする必要がある。
コマンドは以下を実行する。
# make docker-thirdparty
なお、make dockerコマンドで作成されるDockerイメージは以下。
<補足>
・Goのバージョンは1.10.Xを利用すること。
・環境変数には以下を設定すること。
GOROOT=/usr/local/go/bin (GOのビルドパス)
GOPATH=/opt (Fabricのソースパス)
v1.1.0 Release版の手順は以下を参照。
http://memoyasu.blogspot.com/2018/04/hyperledger-fabric-110relase.html
1.1.0と1.2.0の手順の差分は以下。
①Fabaricソース一式をクローンする際、ブランチ名を変更すること。
# git clone -b v1.2.0 https://github.com/hyperledger/fabric.git
# git clone -b v1.2.0 https://github.com/hyperledger/fabric-ca.git
②サードパーティDockerイメージをダウンロードする必要がある。
コマンドは以下を実行する。
# make docker-thirdparty
なお、make dockerコマンドで作成されるDockerイメージは以下。
<補足>
・Goのバージョンは1.10.Xを利用すること。
・環境変数には以下を設定すること。
GOROOT=/usr/local/go/bin (GOのビルドパス)
GOPATH=/opt (Fabricのソースパス)
2018年7月8日日曜日
Hyperledger FabricのCapability機能
Hyperledger Fabric では、大規模なブロックチェーンネットワークを構成することを想定し、異なるバージョンのPEERとORDERERが混在できるように、プロトコルの互換性を確保している (Capability機能という)。
Fabric Java SDKはv1.1を利用し、PEER/ORDERER/CAはv1.2を利用するブロックチェーン環境において、ユーザのenroll、チェーンコードをINVOKE/QUERYできるかを実機検証してみる。
実機確認結果
全てのインターフェースで、互換性を確認できた。
PEERに対するINVOKE:OK
Fabric SDKからPEERへのプロポーザル送信
DEBUG Channel - Channel mychannel got back from peer peer0.org1.example.com status: 200, message:
Fabric SDKからOrdererへのトランザクション送信
DEBUG OrdererClient - resp status value: 200, resp: SUCCESS
PEERからFabric SDKへのブロック通知
DEBUG EventHub - EventHub eventhub01 got event type: BLOCK
PEERに対するQUERY:OK
INFO HFJavaSDKBasicExample - [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR12", "Record":{"colour":"Black","make":"Honda","model":"Accord","owner":"Tom"}},{"Key":"CAR13", "Record":{"colour":"Black","make":"Honda","model":"Accord","owner":"Tom"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]
CAでのユーザ認証: OK
DEBUG HFClient - Setting user context to MSPID: Org1MSP user: admin
Fabric Java SDKはv1.1を利用し、PEER/ORDERER/CAはv1.2を利用するブロックチェーン環境において、ユーザのenroll、チェーンコードをINVOKE/QUERYできるかを実機検証してみる。
実機確認結果
全てのインターフェースで、互換性を確認できた。
PEERに対するINVOKE:OK
Fabric SDKからPEERへのプロポーザル送信
DEBUG Channel - Channel mychannel got back from peer peer0.org1.example.com status: 200, message:
Fabric SDKからOrdererへのトランザクション送信
DEBUG OrdererClient - resp status value: 200, resp: SUCCESS
PEERからFabric SDKへのブロック通知
DEBUG EventHub - EventHub eventhub01 got event type: BLOCK
PEERに対するQUERY:OK
INFO HFJavaSDKBasicExample - [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR12", "Record":{"colour":"Black","make":"Honda","model":"Accord","owner":"Tom"}},{"Key":"CAR13", "Record":{"colour":"Black","make":"Honda","model":"Accord","owner":"Tom"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]
CAでのユーザ認証: OK
DEBUG HFClient - Setting user context to MSPID: Org1MSP user: admin
Hyperledger Fabric 1.1以降で追加されたPEERコマンド
Hyperledger Fabric 1.1以降では、PEERコマンドの機能が大幅に強化された。
新規に追加されたPEERコマンドを使ってみる。
ピアにInstalledされたチェーンコード一覧の取得
# peer chaincode list --installed -C mychannel
Get installed chaincodes on peer:
Name: fabcar, Version: 1.0, Path: github.com/fabcar/go, Id: 4846dcee8e67da7d20eac366587b897cf3906c5fc90a2357f4849aec01fc5358
<解説>
対象のPEERに、以下のチェーンコード名、バージョン、パス、チェーンコードIDがインストールされている
チェーンコード名:fabcar
バージョン:1.0
パス:github.com/fabcar/go
チェーンコードID:4846dcee8e67da7d20eac366587b897cf3906c5fc90a2357f4849aec01fc5358
ピアにInstantiatedされたチェーンコード一覧の取得
# peer chaincode list --instantiated -C mychannel
Get instantiated chaincodes on channel mychannel:
Name: fabcar, Version: 1.0, Path: github.com/fabcar/go, Escc: escc, Vscc: vscc
<解説>
対象のPEERに、以下のチェーンコード名、バージョン、パス、ESCC名、VSCC名がinstantiateされている。
チェーンコード名:fabcar
バージョン:1.0
パス:github.com/fabcar/go
ESCC名:escc (デフォルトのシステムチェーンコード)
VSCC名:vscc(デフォルトのシステムチェーンコード)
PEERが所属するチャネル名一覧の取得
# peer channel list
2018-07-08 05:59:01.746 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Channels peers has joined:
mychanne
#
ブロックチェーン情報の取得
# peer channel getinfo -c mychannel
2018-07-08 06:01:37.432 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Blockchain info: {"height":3,"currentBlockHash":"01gwIBF3LEjesqG/FPAx43jtFFLZv0isOXYXqvbZTPY=","previousBlockHash":"PpP80dqWT2gS8Cwalw8JtIkD0eP5YkxuEih9syr9fSE="}
#
PEERの起動状況の確認
#peer node status
status:STARTED
PEERの起動
# peer node start
そのほか
新規に追加されたPEERコマンドを使ってみる。
ピアにInstalledされたチェーンコード一覧の取得
# peer chaincode list --installed -C mychannel
Get installed chaincodes on peer:
Name: fabcar, Version: 1.0, Path: github.com/fabcar/go, Id: 4846dcee8e67da7d20eac366587b897cf3906c5fc90a2357f4849aec01fc5358
<解説>
対象のPEERに、以下のチェーンコード名、バージョン、パス、チェーンコードIDがインストールされている
チェーンコード名:fabcar
バージョン:1.0
パス:github.com/fabcar/go
チェーンコードID:4846dcee8e67da7d20eac366587b897cf3906c5fc90a2357f4849aec01fc5358
ピアにInstantiatedされたチェーンコード一覧の取得
# peer chaincode list --instantiated -C mychannel
Get instantiated chaincodes on channel mychannel:
Name: fabcar, Version: 1.0, Path: github.com/fabcar/go, Escc: escc, Vscc: vscc
<解説>
対象のPEERに、以下のチェーンコード名、バージョン、パス、ESCC名、VSCC名がinstantiateされている。
チェーンコード名:fabcar
バージョン:1.0
パス:github.com/fabcar/go
ESCC名:escc (デフォルトのシステムチェーンコード)
VSCC名:vscc(デフォルトのシステムチェーンコード)
PEERが所属するチャネル名一覧の取得
# peer channel list
2018-07-08 05:59:01.746 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Channels peers has joined:
mychanne
#
ブロックチェーン情報の取得
# peer channel getinfo -c mychannel
2018-07-08 06:01:37.432 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Blockchain info: {"height":3,"currentBlockHash":"01gwIBF3LEjesqG/FPAx43jtFFLZv0isOXYXqvbZTPY=","previousBlockHash":"PpP80dqWT2gS8Cwalw8JtIkD0eP5YkxuEih9syr9fSE="}
#
PEERの起動状況の確認
#peer node status
status:STARTED
PEERの起動
# peer node start
そのほか
- チェーンコードをアンインストールするコマンドは現時点では提供されていない。
- PEERを停止するコマンドは現時点では提供されていない。
- 2つ以上のEndorsing Peerの署名が必要なINVOKEは、PEERコマンドでは実行できない(1つのEndorsing Peerしかプロポーザルをなげることができないため)。
2018年4月1日日曜日
Hyperledger Fabric 1.1.0 Relase版 インストール
2018/3/20に公開されたHyperledger Fabric 1.1.0 Release版を、ソースからビルドする。
<前提>
・DockerおよびGOがインストール済みであること。
①FabricとFabric-caのソース一式をクローンする。
# git clone -b v1.1.0 https://github.com/hyperledger/fabric.git
# git clone -b v1.1.0 https://github.com/hyperledger/fabric-ca.git
# mkdir -p /opt/fabric/src/github.com/hyperledger/
# cp -rf fabric /opt/fabric/src/github.com/hyperledger
# cp -rf fabric-ca /opt/fabric/src/github.com/hyperledger
②環境変数を設定する。
# export GOPATH=/opt/fabric
# export GOHOME=/opt/fabric
③Fabricのdockerイメージを作成する
# cd $GOHOME/src/github.com/hyperledger/fabric/
# make docker
以下のエラーが発生した場合は、
protoc-gen-goを手動でダウンロードする。
------
cp build/docker/gotools/bin/protoc-gen-go build/bin/chaintool build/goshim.tar.bz2 build/image/ccenv/payload
cp: cannot stat `build/docker/gotools/bin/protoc-gen-go': そのようなファイルやディレクトリはありません
make: *** [build/image/ccenv/payload] エラー 1
------
# go get -u github.com/golang/protobuf/protoc-gen-go
# cp $GOPATH/bin/protoc-gen-go build/docker/gotools/bin/
➃Fabric-caのdockerイメージを作成する
# cd $GOHOME/src/github.com/hyperledger/fabric-ca/
# make docker
<前提>
・DockerおよびGOがインストール済みであること。
①FabricとFabric-caのソース一式をクローンする。
# git clone -b v1.1.0 https://github.com/hyperledger/fabric.git
# git clone -b v1.1.0 https://github.com/hyperledger/fabric-ca.git
# mkdir -p /opt/fabric/src/github.com/hyperledger/
# cp -rf fabric /opt/fabric/src/github.com/hyperledger
# cp -rf fabric-ca /opt/fabric/src/github.com/hyperledger
②環境変数を設定する。
# export GOPATH=/opt/fabric
# export GOHOME=/opt/fabric
③Fabricのdockerイメージを作成する
# cd $GOHOME/src/github.com/hyperledger/fabric/
# make docker
以下のエラーが発生した場合は、
protoc-gen-goを手動でダウンロードする。
------
cp build/docker/gotools/bin/protoc-gen-go build/bin/chaintool build/goshim.tar.bz2 build/image/ccenv/payload
cp: cannot stat `build/docker/gotools/bin/protoc-gen-go': そのようなファイルやディレクトリはありません
make: *** [build/image/ccenv/payload] エラー 1
------
# go get -u github.com/golang/protobuf/protoc-gen-go
# cp $GOPATH/bin/protoc-gen-go build/docker/gotools/bin/
➃Fabric-caのdockerイメージを作成する
# cd $GOHOME/src/github.com/hyperledger/fabric-ca/
# make docker
⑤Dockerイメージが作成されていることを確認する。
2017年11月12日日曜日
Hyperledger Fabric v1.1.0-preview ソースからdockerイメージをビルドする。
Fabric v1.1.0-previewをソースからdockerイメージをビルドする手順。
①FabricとFabric-caのソース一式をクローンする。
# git clone -b v1.1.0-preview https://github.com/hyperledger/fabric.git
# git clone -b v1.1.0-preview https://github.com/hyperledger/fabric-ca.git
# mkdir -p /opt/fabric/src/github.com/hyperledger/
# cp -rf fabric /opt/fabric/src/github.com/hyperledger
# cp -rf fabric-ca /opt/fabric/src/github.com/hyperledger
②環境変数を設定する。
# export GOPATH=/opt/fabric
# export GOHONE=/opt/fabric
③Fabricのdockerイメージを作成する。
# cd $GOHOME/src/github.com/hyperledger/fabric/
# make docker
以下のエラーが発生した。。。
・・・
+ wget -q http://www.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
The command '/bin/sh -c set -x && cd / && wget -q "http://www.apache.org/dist/zookeeper/$DISTRO_NAME/$DISTRO_NAME.tar.gz" && tar -xzf "$DISTRO_NAME.tar.gz" && mv "$DISTRO_NAME/conf/"* "$ZOO_CONF_DIR" && rm -r "$DISTRO_NAME.tar.gz"' returned a non-zero code: 8
Makefile:205: recipe for target 'build/image/zookeeper/.dummy-x86_64-0.7.0-snapshot-c7b3fe0' failed
http://www.apache.org/dist/zookeeper にアクセスしてみると
zookeeper-3.4.9.tar.gzがなく、バージョンが3.4.10以降しかなかった。。。
とりあえず、3.4.10でダウンロードするようにDockerfileを修正する。
# vi build/image/zookeeper/Dockerfile
★以下を変更。
ARG DISTRO_NAME=zookeeper-3.4.10
# make docker
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hyperledger/fabric-tools latest fdd9c70d1af3 27 seconds ago 1.42GB
hyperledger/fabric-tools x86_64-1.1.0-preview fdd9c70d1af3 27 seconds ago 1.42GB
hyperledger/fabric-couchdb latest 866f7fc6e93e 35 seconds ago 1.58GB
hyperledger/fabric-couchdb x86_64-1.1.0-preview 866f7fc6e93e 35 seconds ago 1.58GB
hyperledger/fabric-kafka latest e9f5f8d5f1d4 About a minute ago 1.37GB
hyperledger/fabric-kafka x86_64-1.1.0-preview e9f5f8d5f1d4 About a minute ago 1.37GB
hyperledger/fabric-zookeeper latest f9fe6dffc638 2 minutes ago 1.39GB
hyperledger/fabric-zookeeper x86_64-1.1.0-preview f9fe6dffc638 2 minutes ago 1.39GB
<none> <none> d72c30ec06cb 3 minutes ago 1.33GB
hyperledger/fabric-testenv latest 6bf3e40d7f08 3 minutes ago 1.52GB
hyperledger/fabric-testenv x86_64-1.1.0-preview 6bf3e40d7f08 3 minutes ago 1.52GB
hyperledger/fabric-buildenv latest 0824a7249f44 3 minutes ago 1.41GB
hyperledger/fabric-buildenv x86_64-1.1.0-preview 0824a7249f44 3 minutes ago 1.41GB
hyperledger/fabric-orderer latest 76603b1f0f3e 4 minutes ago 159MB
hyperledger/fabric-orderer x86_64-1.1.0-preview 76603b1f0f3e 4 minutes ago 159MB
hyperledger/fabric-peer latest fcc5a0e8ea59 4 minutes ago 165MB
hyperledger/fabric-peer x86_64-1.1.0-preview fcc5a0e8ea59 4 minutes ago 165MB
hyperledger/fabric-javaenv latest fb70e2629d32 4 minutes ago 1.49GB
hyperledger/fabric-javaenv x86_64-1.1.0-preview fb70e2629d32 4 minutes ago 1.49GB
hyperledger/fabric-ccenv latest 9203193f9935 5 minutes ago 1.35GB
hyperledger/fabric-ccenv x86_64-1.1.0-preview 9203193f9935 5 minutes ago 1.35GB
hyperledger/fabric-baseimage x86_64-0.4.2 76daf60aeff4 6 weeks ago 1.33GB
hyperledger/fabric-baseos x86_64-0.4.2 6be1916d236d 6 weeks ago 130MB
➃Fabric-caのdockerイメージを作成する。
# cd $GOHOME/src/github.com/hyperledger/fabric-ca/
# make docker
# docker images | grep fabric-ca
hyperledger/fabric-ca-tools latest 6164429ffed0 2 hours ago 1.5GB
hyperledger/fabric-ca-tools x86_64-1.1.0-preview 6164429ffed0 2 hours ago 1.5GB
hyperledger/fabric-ca-peer latest 13e583a4648b 2 hours ago 206MB
hyperledger/fabric-ca-peer x86_64-1.1.0-preview 13e583a4648b 2 hours ago 206MB
hyperledger/fabric-ca-orderer latest a88ff1f89153 2 hours ago 200MB
hyperledger/fabric-ca-orderer x86_64-1.1.0-preview a88ff1f89153 2 hours ago 200MB
hyperledger/fabric-ca latest 0a056a6cbdc1 2 hours ago 218MB
hyperledger/fabric-ca x86_64-1.1.0-preview 0a056a6cbdc1 2 hours ago 218MB
<補足>
チェーンコードのコンテナ作成時に利用されるfabric-ccenvにおいて、shimのソースが解凍されていない問題が発生した。
fabric-ccenvコンテナを作成してログインし、確認してみてみる。
root@7c26bd340479:/opt/gopath# ls -l $GOPATH/src/
total 0
-rw-r--r-- 1 root root 0 Nov 12 14:36 goshim.tar.bz2
解凍されないまま、tar.bz2ファイルがある。
しかも、0バイトになっている。。。。
上記の事象が発生した場合は、make peerでコンパイルしてgoshim.tar.bz2を作成した後、所定の位置にコピーする。
その後、make docker-clean&make dockerを実行する。
# apt-get install libltdl-dev
# make peer
# cp build/goshim.tar.bz2 build/image/ccenv/payload/
# make docker-clean
# make docker
①FabricとFabric-caのソース一式をクローンする。
# git clone -b v1.1.0-preview https://github.com/hyperledger/fabric.git
# git clone -b v1.1.0-preview https://github.com/hyperledger/fabric-ca.git
# mkdir -p /opt/fabric/src/github.com/hyperledger/
# cp -rf fabric /opt/fabric/src/github.com/hyperledger
# cp -rf fabric-ca /opt/fabric/src/github.com/hyperledger
②環境変数を設定する。
# export GOPATH=/opt/fabric
# export GOHONE=/opt/fabric
③Fabricのdockerイメージを作成する。
# cd $GOHOME/src/github.com/hyperledger/fabric/
# make docker
以下のエラーが発生した。。。
・・・
+ wget -q http://www.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
The command '/bin/sh -c set -x && cd / && wget -q "http://www.apache.org/dist/zookeeper/$DISTRO_NAME/$DISTRO_NAME.tar.gz" && tar -xzf "$DISTRO_NAME.tar.gz" && mv "$DISTRO_NAME/conf/"* "$ZOO_CONF_DIR" && rm -r "$DISTRO_NAME.tar.gz"' returned a non-zero code: 8
Makefile:205: recipe for target 'build/image/zookeeper/.dummy-x86_64-0.7.0-snapshot-c7b3fe0' failed
http://www.apache.org/dist/zookeeper にアクセスしてみると
zookeeper-3.4.9.tar.gzがなく、バージョンが3.4.10以降しかなかった。。。
とりあえず、3.4.10でダウンロードするようにDockerfileを修正する。
# vi build/image/zookeeper/Dockerfile
★以下を変更。
ARG DISTRO_NAME=zookeeper-3.4.10
# make docker
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hyperledger/fabric-tools latest fdd9c70d1af3 27 seconds ago 1.42GB
hyperledger/fabric-tools x86_64-1.1.0-preview fdd9c70d1af3 27 seconds ago 1.42GB
hyperledger/fabric-couchdb latest 866f7fc6e93e 35 seconds ago 1.58GB
hyperledger/fabric-couchdb x86_64-1.1.0-preview 866f7fc6e93e 35 seconds ago 1.58GB
hyperledger/fabric-kafka latest e9f5f8d5f1d4 About a minute ago 1.37GB
hyperledger/fabric-kafka x86_64-1.1.0-preview e9f5f8d5f1d4 About a minute ago 1.37GB
hyperledger/fabric-zookeeper latest f9fe6dffc638 2 minutes ago 1.39GB
hyperledger/fabric-zookeeper x86_64-1.1.0-preview f9fe6dffc638 2 minutes ago 1.39GB
<none> <none> d72c30ec06cb 3 minutes ago 1.33GB
hyperledger/fabric-testenv latest 6bf3e40d7f08 3 minutes ago 1.52GB
hyperledger/fabric-testenv x86_64-1.1.0-preview 6bf3e40d7f08 3 minutes ago 1.52GB
hyperledger/fabric-buildenv latest 0824a7249f44 3 minutes ago 1.41GB
hyperledger/fabric-buildenv x86_64-1.1.0-preview 0824a7249f44 3 minutes ago 1.41GB
hyperledger/fabric-orderer latest 76603b1f0f3e 4 minutes ago 159MB
hyperledger/fabric-orderer x86_64-1.1.0-preview 76603b1f0f3e 4 minutes ago 159MB
hyperledger/fabric-peer latest fcc5a0e8ea59 4 minutes ago 165MB
hyperledger/fabric-peer x86_64-1.1.0-preview fcc5a0e8ea59 4 minutes ago 165MB
hyperledger/fabric-javaenv latest fb70e2629d32 4 minutes ago 1.49GB
hyperledger/fabric-javaenv x86_64-1.1.0-preview fb70e2629d32 4 minutes ago 1.49GB
hyperledger/fabric-ccenv latest 9203193f9935 5 minutes ago 1.35GB
hyperledger/fabric-ccenv x86_64-1.1.0-preview 9203193f9935 5 minutes ago 1.35GB
hyperledger/fabric-baseimage x86_64-0.4.2 76daf60aeff4 6 weeks ago 1.33GB
hyperledger/fabric-baseos x86_64-0.4.2 6be1916d236d 6 weeks ago 130MB
➃Fabric-caのdockerイメージを作成する。
# cd $GOHOME/src/github.com/hyperledger/fabric-ca/
# make docker
# docker images | grep fabric-ca
hyperledger/fabric-ca-tools latest 6164429ffed0 2 hours ago 1.5GB
hyperledger/fabric-ca-tools x86_64-1.1.0-preview 6164429ffed0 2 hours ago 1.5GB
hyperledger/fabric-ca-peer latest 13e583a4648b 2 hours ago 206MB
hyperledger/fabric-ca-peer x86_64-1.1.0-preview 13e583a4648b 2 hours ago 206MB
hyperledger/fabric-ca-orderer latest a88ff1f89153 2 hours ago 200MB
hyperledger/fabric-ca-orderer x86_64-1.1.0-preview a88ff1f89153 2 hours ago 200MB
hyperledger/fabric-ca latest 0a056a6cbdc1 2 hours ago 218MB
hyperledger/fabric-ca x86_64-1.1.0-preview 0a056a6cbdc1 2 hours ago 218MB
<補足>
チェーンコードのコンテナ作成時に利用されるfabric-ccenvにおいて、shimのソースが解凍されていない問題が発生した。
fabric-ccenvコンテナを作成してログインし、確認してみてみる。
root@7c26bd340479:/opt/gopath# ls -l $GOPATH/src/
total 0
-rw-r--r-- 1 root root 0 Nov 12 14:36 goshim.tar.bz2
解凍されないまま、tar.bz2ファイルがある。
しかも、0バイトになっている。。。。
上記の事象が発生した場合は、make peerでコンパイルしてgoshim.tar.bz2を作成した後、所定の位置にコピーする。
その後、make docker-clean&make dockerを実行する。
# apt-get install libltdl-dev
# make peer
# cp build/goshim.tar.bz2 build/image/ccenv/payload/
# make docker-clean
# make docker
2017年11月3日金曜日
Hyperledger Fabric Exploreを動かしてみる
Hyperledger Fabric ExploreがFabric 1.0.0に対応したということなので動かしてみる。
1.要件
・nodejs 6.9.x
・mysql 5.7 以上
2.インストール手順
①blockchain-explore資材のダウンロード
# git clone https://github.com/hyperledger/blockchain-explorer.git
# cd blockchain-explorer
②MySQLのインストール
# sudo apt install mysql-server
※インストール中にrootのパスワードを設定する。
③MySQLにrootでログインできることを確認する。
# mysql -u root -p
Enter password: XXX
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
➃MySQL用のデータベースを作成する。「fabricexplorer」というExplore専用のデータベースが作成される。
# mysql -u root -p < db/fabricexplorer.sql
Enter password: XXX
# vi config.json
★Fabricの環境にあわせて設定する
{
"host":"localhost",
"port":"8080", ★外部に公開するポート
"channelsList": ["mychannel"], ★チャネルのリストを設定
"GOPATH":"/usr/bin/go",
"keyValueStore":"/tmp/fabric-client-kvs",
"eventWaitTime":"30000",
"enableTls":false,
"users":[
{
"username":"admin", ★CA管理ユーザ
"secret":"XXX"
}
],
"mysql":{ ★MySQLの環境設定
"host":"127.0.0.1",
"port":"3306",
"database":"fabricexplorer",
"username":"root",
"passwd":"XXX"
}
}
# vi ./app/network-config.json
★以下を環境に合わせて修正する。
★TLS通信を利用する場合は「network-config-tls.json」を修正する。
{
"network-config": {
"orderer": [{
"url": "grpc://127.0.0.1:7050",
"server-hostname": "orderer0.example.com"
},{
"url": "grpc://127.0.0.1:8050",
"server-hostname": "orderer1.example.com"
},{
"url": "grpc://127.0.0.1:9050",
"server-hostname": "orderer2.example.com"
}],
"org1": {
"name": "peerOrg1",
"mspid": "Org1MSP",
"ca": "http://127.0.0.1:7054",
"peer1": {
"requests": "grpc://127.0.0.1:7051",
"events": "grpc://127.0.0.1:7053",
"server-hostname": "peer0.org1.example.com"
},
"peer2": {
"requests": "grpc://127.0.0.1:8051",
"events": "grpc://127.0.0.1:8053",
"server-hostname": "peer1.org1.example.com"
},
"admin": {
"key": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore",
"cert": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts"
}
},
"org2": {
"name": "peerOrg2",
"mspid": "Org2MSP",
"ca": "http://127.0.0.1:8054",
"peer1": {
"requests": "grpc://127.0.0.1:9051",
"events": "grpc://127.0.0.1:9053",
"server-hostname": "peer0.org2.example.com"
},
"peer2": {
"requests": "grpc://127.0.0.1:10051",
"events": "grpc://127.0.0.1:10053",
"server-hostname": "peer1.org2.example.com"
},
"admin": {
"key": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore",
"cert": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts"
}
}
}
}
⑥ npmパッケージをインストールする。
# npm install
★失敗するときは、npm rebuild コマンドを実行し、全てリビルド。
⑦ 起動コマンドを実行する。
# ./start.sh
★ポート8080でnodeプロセスが起動する。
★停止したい場合は、pkill node コマンドを実行する。
★ログは同フォルダ配下のlog.logに出力される。
⑧ http://XXX.XXX.XXX.XXX:8080 にアクセスすると以下のようなダッシュボード画面が表示される。
★現状、認証機能はないため、だれでも閲覧可能である。
★PEERLISTに正しいPEER情報が表示されない。
★2つチャネルを作成しているのに、1つしかチャネルが表示されない。
1.要件
・nodejs 6.9.x
・mysql 5.7 以上
2.インストール手順
①blockchain-explore資材のダウンロード
# git clone https://github.com/hyperledger/blockchain-explorer.git
# cd blockchain-explorer
②MySQLのインストール
# sudo apt install mysql-server
※インストール中にrootのパスワードを設定する。
③MySQLにrootでログインできることを確認する。
# mysql -u root -p
Enter password: XXX
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
➃MySQL用のデータベースを作成する。「fabricexplorer」というExplore専用のデータベースが作成される。
# mysql -u root -p < db/fabricexplorer.sql
Enter password: XXX
ue'
Password: eiMiKcDTWwyJ⑤Fabric向けの環境情報を設定する。
# vi config.json
★Fabricの環境にあわせて設定する
{
"host":"localhost",
"port":"8080", ★外部に公開するポート
"channelsList": ["mychannel"], ★チャネルのリストを設定
"GOPATH":"/usr/bin/go",
"keyValueStore":"/tmp/fabric-client-kvs",
"eventWaitTime":"30000",
"enableTls":false,
"users":[
{
"username":"admin", ★CA管理ユーザ
"secret":"XXX"
}
],
"mysql":{ ★MySQLの環境設定
"host":"127.0.0.1",
"port":"3306",
"database":"fabricexplorer",
"username":"root",
"passwd":"XXX"
}
}
# vi ./app/network-config.json
★以下を環境に合わせて修正する。
★TLS通信を利用する場合は「network-config-tls.json」を修正する。
{
"network-config": {
"orderer": [{
"url": "grpc://127.0.0.1:7050",
"server-hostname": "orderer0.example.com"
},{
"url": "grpc://127.0.0.1:8050",
"server-hostname": "orderer1.example.com"
},{
"url": "grpc://127.0.0.1:9050",
"server-hostname": "orderer2.example.com"
}],
"org1": {
"name": "peerOrg1",
"mspid": "Org1MSP",
"ca": "http://127.0.0.1:7054",
"peer1": {
"requests": "grpc://127.0.0.1:7051",
"events": "grpc://127.0.0.1:7053",
"server-hostname": "peer0.org1.example.com"
},
"peer2": {
"requests": "grpc://127.0.0.1:8051",
"events": "grpc://127.0.0.1:8053",
"server-hostname": "peer1.org1.example.com"
},
"admin": {
"key": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore",
"cert": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts"
}
},
"org2": {
"name": "peerOrg2",
"mspid": "Org2MSP",
"ca": "http://127.0.0.1:8054",
"peer1": {
"requests": "grpc://127.0.0.1:9051",
"events": "grpc://127.0.0.1:9053",
"server-hostname": "peer0.org2.example.com"
},
"peer2": {
"requests": "grpc://127.0.0.1:10051",
"events": "grpc://127.0.0.1:10053",
"server-hostname": "peer1.org2.example.com"
},
"admin": {
"key": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore",
"cert": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts"
}
}
}
}
⑥ npmパッケージをインストールする。
# npm install
★失敗するときは、npm rebuild コマンドを実行し、全てリビルド。
⑦ 起動コマンドを実行する。
# ./start.sh
★ポート8080でnodeプロセスが起動する。
★停止したい場合は、pkill node コマンドを実行する。
★ログは同フォルダ配下のlog.logに出力される。
⑧ http://XXX.XXX.XXX.XXX:8080 にアクセスすると以下のようなダッシュボード画面が表示される。
★現状、認証機能はないため、だれでも閲覧可能である。
★PEERLISTに正しいPEER情報が表示されない。
★2つチャネルを作成しているのに、1つしかチャネルが表示されない。
2017年11月2日木曜日
Hyperledger Fabric CAのDBの中身をみてみる
Fabric CAは、デフォルトではSqlite3にユーザ情報や証明書情報が格納される。
Sqlite3のテーブルには実際にどんな情報が格納されているかを確認してみる。
①(事前準備)ホストOS側でsqlite3コマンドをインストールする。
# sudo apt-get install sqlite3 libsqlite3-dev
②CAコンテナからホストOSにsqlite3のdbファイルをコピーする
# sudo docker cp ca_peerOrg2:/etc/hyperledger/fabric-ca-server/fabric-ca-server.db ./fabric-ca-server.db
③sqlite3コマンドでテーブルを参照する。
★「users」、「certificates」、「affiliations」という3つのテーブルが存在している。
# sqlite3 fabric-ca-server.db
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite>.table
affiliations certificates users
➃テーブルのスキーマ情報を参照する。
sqlite> .schema
CREATE TABLE users (id VARCHAR(64), token bytea, type VARCHAR(64), affiliation VARCHAR(64), attributes VARCHAR(256), state INTEGER, max_enrollments INTEGER);
CREATE TABLE affiliations (name VARCHAR(64) NOT NULL UNIQUE, prekey VARCHAR(64));
CREATE TABLE certificates (id VARCHAR(64), serial_number blob NOT NULL, authority_key_identifier blob NOT NULL, ca_label blob, status blob NOT NULL, reason int, expiry timestamp, revoked_at timestamp, pem blob NOT NULL, PRIMARY KEY(serial_number, authority_key_identifier));
■usersテーブル
id VARCHAR(64):ユーザID
token bytea:パスワード(暗号化されているっぽい)
type VARCHAR(64):ユーザ種別
affiliation VARCHAR(64):アフィリエーション情報
attributes VARCHAR(256):属性情報
state INTEGER:ステータス
max_enrollments INTEGER:最大ENROLLMENT数。デフォルトは-1(無制限)
■affiationsテーブル
name VARCHAR(64):アフィリエーション名
prekey VARCHAR(64):上位階層のアフィリエーション名
■certificatesテーブル
id VARCHAR(64):ユーザID
serial_number blob:証明書シリアル番号
authority_key_identifier blob:認証局鍵識別子(CA公開鍵のハッシュ値)
ca_label blob:CAの名前
status blob:証明書のステータス
reason int:証明書失効の理由
expiry timestamp:証明書有効期限
revoked_at timestamp:証明書失効日時
pem blob:証明書情報(PEM形式)
<実際の値>
■usersテーブル
sqlite> SELECT * FROM users;
admin|$2a$10$C5UFCN0iFS9PnMkhohevYu3uJPc9pGgY9rb1M77ZWM07gOUKnQ8z6|client||[{"name":"hf.Registrar.Roles","value":"client,user,peer,validator,auditor"},{"name":"hf.Registrar.DelegateRoles","value":"client,user,validator,auditor"},{"name":"hf.Revoker","value":"1"},{"name":"hf.IntermediateCA","value":"1"}]|0|-1
■affiationsテーブル
sqlite> SELECT * FROM affiliations;
org2|
org2.department1|org2
org1|
org1.department1|org1
org1.department2|org1
■certificatesテーブル
Sqlite3のテーブルには実際にどんな情報が格納されているかを確認してみる。
①(事前準備)ホストOS側でsqlite3コマンドをインストールする。
# sudo apt-get install sqlite3 libsqlite3-dev
②CAコンテナからホストOSにsqlite3のdbファイルをコピーする
# sudo docker cp ca_peerOrg2:/etc/hyperledger/fabric-ca-server/fabric-ca-server.db ./fabric-ca-server.db
③sqlite3コマンドでテーブルを参照する。
★「users」、「certificates」、「affiliations」という3つのテーブルが存在している。
# sqlite3 fabric-ca-server.db
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite>.table
affiliations certificates users
➃テーブルのスキーマ情報を参照する。
sqlite> .schema
CREATE TABLE users (id VARCHAR(64), token bytea, type VARCHAR(64), affiliation VARCHAR(64), attributes VARCHAR(256), state INTEGER, max_enrollments INTEGER);
CREATE TABLE affiliations (name VARCHAR(64) NOT NULL UNIQUE, prekey VARCHAR(64));
CREATE TABLE certificates (id VARCHAR(64), serial_number blob NOT NULL, authority_key_identifier blob NOT NULL, ca_label blob, status blob NOT NULL, reason int, expiry timestamp, revoked_at timestamp, pem blob NOT NULL, PRIMARY KEY(serial_number, authority_key_identifier));
■usersテーブル
id VARCHAR(64):ユーザID
token bytea:パスワード(暗号化されているっぽい)
type VARCHAR(64):ユーザ種別
affiliation VARCHAR(64):アフィリエーション情報
attributes VARCHAR(256):属性情報
state INTEGER:ステータス
max_enrollments INTEGER:最大ENROLLMENT数。デフォルトは-1(無制限)
■affiationsテーブル
name VARCHAR(64):アフィリエーション名
prekey VARCHAR(64):上位階層のアフィリエーション名
■certificatesテーブル
id VARCHAR(64):ユーザID
serial_number blob:証明書シリアル番号
authority_key_identifier blob:認証局鍵識別子(CA公開鍵のハッシュ値)
ca_label blob:CAの名前
status blob:証明書のステータス
reason int:証明書失効の理由
expiry timestamp:証明書有効期限
revoked_at timestamp:証明書失効日時
pem blob:証明書情報(PEM形式)
<実際の値>
■usersテーブル
sqlite> SELECT * FROM users;
admin|$2a$10$C5UFCN0iFS9PnMkhohevYu3uJPc9pGgY9rb1M77ZWM07gOUKnQ8z6|client||[{"name":"hf.Registrar.Roles","value":"client,user,peer,validator,auditor"},{"name":"hf.Registrar.DelegateRoles","value":"client,user,validator,auditor"},{"name":"hf.Revoker","value":"1"},{"name":"hf.IntermediateCA","value":"1"}]|0|-1
■affiationsテーブル
sqlite> SELECT * FROM affiliations;
org2|
org2.department1|org2
org1|
org1.department1|org1
org1.department2|org1
■certificatesテーブル
2017年9月18日月曜日
Hyperledger Fabric v1.0.0 monitoring blockchainを使ってみる
EPCPノードの監視ツールであるmonitoring blockchainを使ってみる。
ざっとソースを眺めると以下のことが分かった。
・ダッシュボードはOSS Grafanaを利用している模様。
・WebサーバはOSS Spring Bootを利用している模様。
・Grafanaが利用するDBはOSS InfuxDBを利用している模様。
・EPCPノードやCAへの接続処理は、Fabric SDK for Javaは利用している模様。
以下の手順では、EPCPノード、OS、CAは構築済みの 前提。
ざっとソースを眺めると以下のことが分かった。
・ダッシュボードはOSS Grafanaを利用している模様。
・WebサーバはOSS Spring Bootを利用している模様。
・Grafanaが利用するDBはOSS InfuxDBを利用している模様。
・EPCPノードやCAへの接続処理は、Fabric SDK for Javaは利用している模様。
以下の手順では、EPCPノード、OS、CAは構築済みの 前提。
- monitoring blockchainのDockerコンテナをPULLする。
# docker pull blockchainmonitoring/blockchain-monitoring:latest - Dockerコンテナがダウンロードされたことを確認する。
# docker images | grep monitoring
blockchainmonitoring/blockchain-monitoring latest f44f980e709e 35 hours ago 1.1GB - docker-compose.yamlを準備する。
- Fabric向けのネットワーク設定ファイル(net-config.yaml)を準備する。
MSPの設定やCAやEPCPノードのURLを設定する。また、管理ユーザであるadminのprivkeyには秘密鍵、certには公開鍵証明書を指定する。 - FABRIC_NET_CONFIGとCERTS_ADMIN環境変数のパスを設定する。
# export FABRIC_NET_CONFIG=/root/monitoring/net-config.yaml
# export CERTS_ADMIN=/root/monitoring/certs - docker-composeコマンドでコンテナを作成する。
# docker-compose up - 以下のURLにアクセスする(XXXは環境に合わせて指定する)。
http://XXX.XXX.XXX.XXX:3000 - ダッシュボード画面が表示されることを確認する。
EPCPのステータス(UP/DOWN)、チャネル情報、配備されたチェーンコードを確認することができる。INVOKE/QUERYの実行履歴等も表示されるはずだがされていない。。。時間があったらしらべてみよう。
2017年7月23日日曜日
Hyperdeger Fabric 1.0.0付属のサンプルコードを動かしてみる
Hyperdeger Fabric 1.0.0付属のサンプルコードを動かしてみます。
サンプルコードのイメージ図
(https://hyperledger-fabric.readthedocs.io/en/latest/write_first_app.htmlより抜粋)

query.jsソースをのぞいてみると、だいたい以下のことを実行している。
ユーザID'PeerAdmin’を利用する。チャネル名'mychannel'を指定する。また、チェーンコードID'fabcar'を指定して、7051ポートにアクセスする
var options = {
wallet_path: path.join(__dirname, './creds'),
user_id: 'PeerAdmin',
channel_id: 'mychannel',
chaincode_id: 'fabcar',
network_url: 'grpc://localhost:7051',
};
Fabric Client SDKを呼び出し、認証に必要なKeyValueStoreを作成する。
client = new hfc();
return hfc.newDefaultKeyValueStore({ path: options.wallet_path });
チャネルを作成し、Peerノードに追加する。
channel = client.newChannel(options.channel_id);
channel.addPeer(client.newPeer(options.network_url));
トランザクションIDを生成し、'queryAllCars'という関数を呼び出す。
var transaction_id = client.newTransactionID();
console.log("Assigning transaction_id: ", transaction_id._transaction_id);
// queryCar - requires 1 argument, ex: args: ['CAR4'],
// queryAllCars - requires no arguments , ex: args: [''],
const request = {
chaincodeId: options.chaincode_id,
txId: transaction_id,
fcn: 'queryAllCars',
args: ['']
};
return channel.queryByChaincode(request);
サンプルコードのイメージ図
(https://hyperledger-fabric.readthedocs.io/en/latest/write_first_app.htmlより抜粋)
- ブロックチェーンネットワークの分散台帳に書き込むには、スマートコントラクトが必要。
- 業務側のアプリケーションは、Fabricのネットワークエンドポイントにアクセスし、スマートコンストラクトを実行する
- サンプルでは、台帳として車情報を管理し、アプリケーションに返す
- 言語はJavaScriptを利用
- サンプルのダウンロード
# git clone https://github.com/hyperledger/fabric-samples.git
# cd fabric-samples/fabcar
# ls
creds invoke.js package.json query.js startFabric.sh - startFabric.shの実行
#./startFabric.sh
このシェルを実行すると、サンプルを動かす環境を自動的に構築してくれる。
シェルの中身をみてみると、だいたい以下のことを実行している。
・まず最初に、必要なDockerイメージのダウンロード
・Docker-composeでDockerコンテナの立ち上げ。以下の4つのコンテナを作成している。
Creating orderer.example.com
Creating ca.example.com
Creating couchdb
Creating peer0.org1.example.com
・ブロックチェーンネットワークを構成するチャネルの作成
・「peer0.org1.example.com」というノードをチャネルへ追加
・CLIコンテナの作成
・サンプルチェーンコードのインストール
・サンプルチェーンコードのイニシエト
・サンプルチェーンコードの実行
docker psで確認してみると、以下のコンテナが起動されている。 - fabric-samples/fabcar配下で以下のコマンドを実行し、必要なパッケージをダウンロード
# npm install - クエリーから実行してみる。10データ分の車情報を取得できる。
query.jsソースをのぞいてみると、だいたい以下のことを実行している。
ユーザID'PeerAdmin’を利用する。チャネル名'mychannel'を指定する。また、チェーンコードID'fabcar'を指定して、7051ポートにアクセスする
var options = {
wallet_path: path.join(__dirname, './creds'),
user_id: 'PeerAdmin',
channel_id: 'mychannel',
chaincode_id: 'fabcar',
network_url: 'grpc://localhost:7051',
};
Fabric Client SDKを呼び出し、認証に必要なKeyValueStoreを作成する。
client = new hfc();
return hfc.newDefaultKeyValueStore({ path: options.wallet_path });
チャネルを作成し、Peerノードに追加する。
channel = client.newChannel(options.channel_id);
channel.addPeer(client.newPeer(options.network_url));
トランザクションIDを生成し、'queryAllCars'という関数を呼び出す。
var transaction_id = client.newTransactionID();
console.log("Assigning transaction_id: ", transaction_id._transaction_id);
// queryCar - requires 1 argument, ex: args: ['CAR4'],
// queryAllCars - requires no arguments , ex: args: [''],
const request = {
chaincodeId: options.chaincode_id,
txId: transaction_id,
fcn: 'queryAllCars',
args: ['']
};
return channel.queryByChaincode(request);
2017年7月17日月曜日
Hyperdeger Fabric 1.0.0 のソースからDockerイメージを作成してみる
Hyperdeger Fabric 1.0.0がリリースしたということで、ソースからDockerイメージを作成してみます。
OSはUbuntu 16.04を利用します(Google Cloud Platformの1年お試し無料を使いました)。
OSはUbuntu 16.04を利用します(Google Cloud Platformの1年お試し無料を使いました)。
- 前提条件
Git client
Go - 1.7 or later (for releases before v1.0, 1.6 or later)
Docker - 1.12 or later
Docker Compose - 1.8.1 or later
Pip - GOPATHの設定
export GOPATH=/usr/lib/go-1.8 - FafbricのDockerイメージを作成する
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone http://gerrit.hyperledger.org/r/fabric
sudo ./fabric/devenv/setupUbuntuOnPPC64le.sh
cd $GOPATH/src/github.com/hyperledger/fabric
make dist-clean docker - Dockerイメージが作成されていることを確認する
ちゃんと作成されてました。
(とおもってけど、バージョンが1.0.1になってます。。。とりあえず先に進みましょう)
次回は、ミニマム構成で動かしてみます。export GOPATH=/usr/lib/go-1.8
2017年6月16日金曜日
Hyperledger Fabric Client SDK ( node) が提供しているRESTを使ってみる
Hyperledger Fabric Client SDK ( node) β版では、REST APIのサンプルを提供している。さっそく使ってみる。
■jimというユーザでログイン
- node、npm 、gulpをインストールする。
$ apt-get install build-essential libssl-dev
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
$ . ~/.profile
$ nvm install 6.9.5
$ node -v
v6.9.5
$ npm -v
3.10.10
$ npm install -g gulp
$ gulp -v
[00:52:30] CLI version 3.9.1 - β版のソース一式をダウンロードする。
$ git clone -b v1.0.0-beta https://github.com/hyperledger/fabric-sdk-node.git - 必要なパッケージをインストールする。
$ cd fabric-sdk-node/examples/balance-transfer/
$ sudo npm install - 付属のDocker-compose.yamlを使って、必要なDockerイメージをダウンロードする。
$ docker-compose -f artifacts/docker-compose.yaml pull - 別のターミナル端末を起動し、RESTサービスを起動する。
$ cd fabric-sdk-node/examples/balance-transfer
$ sudo ./runApp.sh
起動途中で以下のエラーが発生した。
■エラー内容①
7357 verbose stack Error: grpc@1.2.4 install: `node-pre-gyp install --fallback-to-build`
その場合は、以下のコマンドを実行してトライしてみる。
$ sudo npm install -g @google-cloud/functions-emulator
<参考>
https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/107
■エラー内容②
Error: Cannot find module '/root/fabric-sdk-node/examples/balance-transfer/node_modules/grpc/src/node/extension_binary/grpc_node.node'
上記のエラーがでた場合は、いったんリビルドをする。
$ sudo npm rebuild
以上でセットアップは完了。
実際にREST APIを呼び出してみる。
$ curl -s -X POST http://localhost:4000/users -H "content-type: application/x-www-form-urlencoded" -d 'username=Jim&orgName=org1'
{"success":true,"secret":"WVjrlkvYHDnw","message":"Jim enrolled Successfully","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A"}
HTTP応答レスポンスにトークンが含まれる(赤色箇所)。
以降の操作では、このトークンをヘッダに含める。
■チャネルの作成
$ curl -s -X POST \
http://localhost:4000/channels \
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
-H "content-type: application/json" \
-d '{
"channelName":"mychannel",
"channelConfigPath":"../artifacts/channel/mychannel.tx"
}'
{"success":true,"message":"Channel 'mychannel' created Successfully"}
■チャネルへのPeerの追加
$ curl -s -X POST http://localhost:4000/channels/mychannel/peers -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" -H "content-type: application/json" -d '{"peer
s": ["localhost:7051","localhost:7056"]}'
{"success":true,"message":"Successfully joined peers in organization org1 to the channel 'mychannel'"}
■チェーンコードのインストール
$curl -s -X POST \
http://localhost:4000/chaincodes \
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
-H "content-type: application/json" \
-d '{"peers": ["localhost:7051","localhost:7056"],"chaincodeName":"mycc","chaincodePath":"github.com/example_cc","chaincodeVersion":"v0"}'
Successfully Installed chaincode on organization org1root
■チェーンコードのイニシエイト
$ curl -s -X POST http://localhost:4000/channels/mychannel/chaincodes -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" -H "content-type: application/json" -d '{"peers": ["localhost:7051"],"chaincodeName":"mycc","chaincodeVersion":"v0","functionName":"init","args":["a","100","b","200"]}'
Chaincode Instantiateion is SUCCESS'
■チェーンコードのINVOKE
$ curl -s -X POST \
http://localhost:4000/channels/mychannel/chaincodes/mycc \
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
-H "content-type: application/json" \
-d '{"peers": ["localhost:7051", "localhost:7056"],"fcn":"invoke","args":["move","a","b","10"]}'
b3e514c0e13e55adcd32525a955dc684fae9857f177c6977164c0d6d24bd1d65
■チェーンコードのQuery
$ curl -s -X GET \
"http://localhost:4000/channels/mychannel/chaincodes/mycc?peer=peer1&args=%5B%22query%22%2C%22a%22%5D" \
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
-H "content-type: application/json"
User b now has 90 after the move
■ブロックチェーン情報の取得
$ curl -s -X GET \
"http://localhost:4000/channels/mychannel?peer=peer1" \
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
-H "content-type: application/json"
{"height":{"low":3,"high":0,"unsigned":true},"currentBlockHash":{"buffer":{"type":"Buffer","data":[8,3,18,32,238,74,52,185,78,207,197,24,251,103,242,39,149,43,68,78,203,29,98,6,212,199,91,181,66,242,181,26,41,251,254,183,26,32,103,135,106,238,68,1,243,164,59,180,96,123,114,148,65,25,148,216,71,229,31,37,60,207,244,85,206,92,237,33,53,8]},"offset":4,"markedOffset":-1,"limit":36,"littleEndian":true,"noAssert":false},"previousBlockHash":{"buffer":{"type":"Buffer","data":[8,3,18,32,238,74,52,185,78,207,197,24,251,103,242,39,149,43,68,78,203,29,98,6,212,199,91,181,66,242,181,26,41,251,254,183,26,32,103,135,106,238,68,1,243,164,59,180,96,123,114,148,65,25,148,216,71,229,31,37,60,207,244,85,206,92,237,33,53,8]},"offset":38,"markedOffset":-1,"limit":70,"littleEndian":true,"noAssert":false}}
■ブロック情報の取得
$curl -s -X GET \
"http://localhost:4000/channels/mychannel/blocks/2?peer=peer1" \
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
-H "content-type: application/json"
{"header":{"number":{"low":2,"high":0,"unsigned":true},"previous_hash":"67876aee4401f3a43bb4607b7294411994d847e51f253ccff455ce5ced213508","data_hash":"7f82a6cb269ffce48cf318a880a75afb2d85d41b4ef3ab9b7eab92c180c78465"},"data":{"data":[{"signature":{"type":"Buffer","data":[48,68,2,32,60,157,40,51,123,55,4,182,68,132,218,122,141,74,117,54,8,49,117,25,248,64,128,89,210,108,219,12,145,54,25,128,2,32,93,50,247,22,170,72,137,21,57,103,217,212,174,121,149,9,159,19,223,255,244,190,252,47,228,47,148,54,71,85,46,190]},"payload":{"header":{"channel_header":{"type":"ENDORSER_TRANSACTION","version":3,"timestamp":"Fri Jun 16 2017 22:27:22 GMT+0900 (JST)","channel_id":"mychannel","tx_id":"b3e514c0e13e55adcd32525a955dc684fae9857f177c6977164c0d6d24bd1d65","epoch":0,"extension":{"type":"Buffer","data":[18,6,18,4,109,121,99,99]}},"signature_header":{"creator":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN CERTIFICATE-----\nMIIB7zCCAZWgAwIBAgIUNLc4T4ZCmXhsM1Fgooi4FMSFNe4wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjE2MTMwMTAwWhcNMTgwNjE2MTMw\nMTAwWjAOMQwwCgYDVQQDEwNKaW0wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARg\nwqB1kG2Bn5yrMRqQN59KHOI2O1G8xSy14sRE6Ls2a6opRo7OE90jTESuvFge/TJq\nG3GzApIEDk7Sf/cVhwjgo2wwajAOBgNVHQ8BAf8EBAMCAgQwDAYDVR0TAQH/BAIw\nADAdBgNVHQ4EFgQUlF6Ndc38jvQfZqoiLKTRSsPZHIIwKwYDVR0jBCQwIoAgsKWn\nPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMwCgYIKoZIzj0EAwIDSAAwRQIh\nAMJilFPdkTsGYYXyRrqKqC69OIIrVdERhUm+DuJNKnGiAiASZWwVxHQCM+zniuKz\nfka8oLlP5qPeefBKW8CruV1Rzg==\n-----END CERTIFICATE-----\n"},"nonce":{"type":"Buffer","data":[162,94,185,37,84,27,79,1,97,219,219,180,254,64,132,36,90,229,28,126,139,36,11,14]}}},"data":{"actions":[{"header":{"creator":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN CERTIFICATE-----\nMIIB7zCCAZWgAwIBAgIUNLc4T4ZCmXhsM1Fgooi4FMSFNe4wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjE2MTMwMTAwWhcNMTgwNjE2MTMw\nMTAwWjAOMQwwCgYDVQQDEwNKaW0wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARg\nwqB1kG2Bn5yrMRqQN59KHOI2O1G8xSy14sRE6Ls2a6opRo7OE90jTESuvFge/TJq\nG3GzApIEDk7Sf/cVhwjgo2wwajAOBgNVHQ8BAf8EBAMCAgQwDAYDVR0TAQH/BAIw\nADAdBgNVHQ4EFgQUlF6Ndc38jvQfZqoiLKTRSsPZHIIwKwYDVR0jBCQwIoAgsKWn\nPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMwCgYIKoZIzj0EAwIDSAAwRQIh\nAMJilFPdkTsGYYXyRrqKqC69OIIrVdERhUm+DuJNKnGiAiASZWwVxHQCM+zniuKz\nfka8oLlP5qPeefBKW8CruV1Rzg==\n-----END CERTIFICATE-----\n"},"nonce":{"type":"Buffer","data":[162,94,185,37,84,27,79,1,97,219,219,180,254,64,132,36,90,229,28,126,139,36,11,14]}},"payload":{"chaincode_proposal_payload":{"input":"\n$\b\u0001\u0012\u0006\u0012\u0004mycc\u001a\u0018\n\u0006invoke\n\u0004move\n\u0001a\n\u0001b\n\u000210"},"action":{"proposal_response_payload":{"proposal_hash":"b07d7721b74f5e0ad948648c514797e395b9cf53a9bc56d3dd5f397ec01fa1ed","extension":{"results":{"data_model":0,"ns_rwset":[{"namespace":"lscc","rwset":{"reads":[{"key":"mycc","version":{"block_num":{"low":1,"high":0,"unsigned":true},"tx_num":{"low":0,"high":0,"unsigned":true}}}],"range_queries_info":[],"writes":[]}},{"namespace":"mycc","rwset":{"reads":[{"key":"a","version":{"block_num":{"low":1,"high":0,"unsigned":true},"tx_num":{"low":0,"high":0,"unsigned":true}}},{"key":"b","version":{"block_num":{"low":1,"high":0,"unsigned":true},"tx_num":{"low":0,"high":0,"unsigned":true}}}],"range_queries_info":[],"writes":[{"key":"a","is_delete":false,"value":"90"},{"key":"b","is_delete":false,"value":"210"}]}}]},"events":{"chaincode_id":"","tx_id":"","event_name":"","payload":{"type":"Buffer","data":[]}},"response":{"status":200,"message":"","payload":""}}},"endorsements":[{"endorser":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN -----\nMIICWjCCAgGgAwIBAgIRAPGLVnARPOpXbAd4X38Sg60wCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjAxMTQxNzI2WhcNMjcwNTMwMTQxNzI2\nWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMS5leGFtcGxlLmNvbTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABP68ne3e/ND5mJbQBgD/uFJai+6pND7p\nsucoOuQh7onYKt7YGafxUPTleAIdtM0BXUpvfcG8T612Qe0wOz/+VbyjgY0wgYow\nDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQC\nMAAwKwYDVR0jBCQwIoAgsKWnPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMw\nKAYDVR0RBCEwH4IWcGVlcjAub3JnMS5leGFtcGxlLmNvbYIFcGVlcjAwCgYIKoZI\nzj0EAwIDRwAwRAIgbQiRzF3Y1NKEHOy809ZHLLj8KS535l4p5W9kWBUjr/0CICYs\ny2MGqiWbH8EV/J3viNR25QL8yniybnfdCGrJKZWy\n-----END -----\n"},"signature":{"type":"Buffer","data":[48,68,2,32,1,214,86,206,84,180,130,208,63,161,245,73,165,182,182,133,11,5,217,95,157,252,81,75,132,145,31,96,167,113,147,198,2,32,96,251,10,164,122,252,80,205,32,214,85,249,233,160,133,62,68,47,130,82,206,168,3,44,164,38,68,183,82,73,232,33]}},{"endorser":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN -----\nMIICWjCCAgGgAwIBAgIRAPxYG1oPao/E8U8Lyvr5U3MwCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjAxMTQxNzI2WhcNMjcwNTMwMTQxNzI2\nWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjEub3JnMS5leGFtcGxlLmNvbTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOtQO5PNelHBjyYXsP1J9r3d6qv/xMpX\n70w5g/wRFTzdDU78sVsOmiEShPIU7Klf3sv7nhwcqHapgly/n5AnjqqjgY0wgYow\nDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQC\nMAAwKwYDVR0jBCQwIoAgsKWnPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMw\nKAYDVR0RBCEwH4IWcGVlcjEub3JnMS5leGFtcGxlLmNvbYIFcGVlcjEwCgYIKoZI\nzj0EAwIDRwAwRAIgJ0/jdJFdQSHEG/mY1xhefSur0kOqomwT85Ngvxjk2UQCIBBF\ndjbzrCMPYOUHxLMJ94gXIpKgE3ReHec1fCBcsty7\n-----END -----\n"},"signature":{"type":"Buffer","data":[48,69,2,33,0,179,53,0,99,27,119,155,180,132,240,15,64,4,1,169,166,234,22,27,66,97,167,13,140,57,123,118,170,178,213,117,55,2,32,8,251,185,112,243,125,30,245,236,167,153,254,58,106,137,165,249,191,160,217,77,110,219,108,33,3,144,49,143,81,71,42]}}]}}}]}}}]},"metadata":{"metadata":[{"value":"","signatures":[{"signature_header":{"creator":{"Mspid":"OrdererMSP","IdBytes":"-----BEGIN -----\nMIICTTCCAfOgAwIBAgIRAPgOpt3+Nfk+01sMdz6kzN4wCgYIKoZIzj0EAwIwaTEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\ncGxlLmNvbTAeFw0xNzA2MDExNDE3MjZaFw0yNzA1MzAxNDE3MjZaMFgxCzAJBgNV\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\nc2NvMRwwGgYDVQQDExNvcmRlcmVyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI\nKoZIzj0DAQcDQgAENf3ZkpKtXwTy9erYtMCBYeeSU/4u996yTkzYABFRjJUCPHJF\nLBZjSf2RSLZ8dlEN9FlP6amXuMy6ESmlJr/5eqOBjDCBiTAOBgNVHQ8BAf8EBAMC\nBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAi\ngCDKy+d5gMYuWR00XMdeft2au4DqZ8BUogACgPt3Vq5ihjAnBgNVHREEIDAeghNv\ncmRlcmVyLmV4YW1wbGUuY29tggdvcmRlcmVyMAoGCCqGSM49BAMCA0gAMEUCIQD6\n5QcBFKKi6z8PTr4aXG+y0f6/xDS1MsG+iObnwGJntwIgROOBaIgOsYWqF4RAsTTk\n3UbaTPHBRgfC9n1ikfF4jHA=\n-----END -----\n"},"nonce":{"type":"Buffer","data":[55,114,35,43,55,236,240,19,29,148,206,31,37,186,133,193,185,113,21,111,220,13,245,114]}},"signature":{"type":"Buffer","data":[48,68,2,32,100,57,88,147,254,14,203,244,186,35,180,73,41,65,188,19,111,217,239,167,180,38,49,172,82,203,250,251,198,36,15,106,2,32,125,121,136,118,156,56,132,60,100,76,232,215,5,247,105,147,216,87,105,55,216,182,209,233,211,182,6,109,160,31,83,124]}}]},{"value":{"index":{"low":0,"high":0,"unsigned":true}},"signatures":[{"signature_header":{"creator":{"Mspid":"OrdererMSP","IdBytes":"-----BEGIN -----\nMIICTTCCAfOgAwIBAgIRAPgOpt3+Nfk+01sMdz6kzN4wCgYIKoZIzj0EAwIwaTEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\ncGxlLmNvbTAeFw0xNzA2MDExNDE3MjZaFw0yNzA1MzAxNDE3MjZaMFgxCzAJBgNV\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\nc2NvMRwwGgYDVQQDExNvcmRlcmVyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI\nKoZIzj0DAQcDQgAENf3ZkpKtXwTy9erYtMCBYeeSU/4u996yTkzYABFRjJUCPHJF\nLBZjSf2RSLZ8dlEN9FlP6amXuMy6ESmlJr/5eqOBjDCBiTAOBgNVHQ8BAf8EBAMC\nBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAi\ngCDKy+d5gMYuWR00XMdeft2au4DqZ8BUogACgPt3Vq5ihjAnBgNVHREEIDAeghNv\ncmRlcmVyLmV4YW1wbGUuY29tggdvcmRlcmVyMAoGCCqGSM49BAMCA0gAMEUCIQD6\n5QcBFKKi6z8PTr4aXG+y0f6/xDS1MsG+iObnwGJntwIgROOBaIgOsYWqF4RAsTTk\n3UbaTPHBRgfC9n1ikfF4jHA=\n-----END -----\n"},"nonce":{"type":"Buffer","data":[232,75,153,152,127,237,61,253,104,27,97,201,8,10,69,39,25,105,48,228,9,145,186,76]}},"signature":{"type":"Buffer","data":[48,68,2,32,110,209,136,243,215,85,58,109,143,69,201,5,41,112,191,134,229,34,26,6,123,254,37,186,238,54,56,40,185,255,138,120,2,32,70,54,73,69,1,36,130,77,94,38,33,159,225,145,135,70,94,217,55,78,35,234,33,58,187,251,231,168,56,166,24,210]}}]},[]]}}
{"header":{"number":{"low":2,"high":0,"unsigned":true},"previous_hash":"67876aee4401f3a43bb4607b7294411994d847e51f253ccff455ce5ced213508","data_hash":"7f82a6cb269ffce48cf318a880a75afb2d85d41b4ef3ab9b7eab92c180c78465"},"data":{"data":[{"signature":{"type":"Buffer","data":[48,68,2,32,60,157,40,51,123,55,4,182,68,132,218,122,141,74,117,54,8,49,117,25,248,64,128,89,210,108,219,12,145,54,25,128,2,32,93,50,247,22,170,72,137,21,57,103,217,212,174,121,149,9,159,19,223,255,244,190,252,47,228,47,148,54,71,85,46,190]},"payload":{"header":{"channel_header":{"type":"ENDORSER_TRANSACTION","version":3,"timestamp":"Fri Jun 16 2017 22:27:22 GMT+0900 (JST)","channel_id":"mychannel","tx_id":"b3e514c0e13e55adcd32525a955dc684fae9857f177c6977164c0d6d24bd1d65","epoch":0,"extension":{"type":"Buffer","data":[18,6,18,4,109,121,99,99]}},"signature_header":{"creator":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN CERTIFICATE-----\nMIIB7zCCAZWgAwIBAgIUNLc4T4ZCmXhsM1Fgooi4FMSFNe4wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjE2MTMwMTAwWhcNMTgwNjE2MTMw\nMTAwWjAOMQwwCgYDVQQDEwNKaW0wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARg\nwqB1kG2Bn5yrMRqQN59KHOI2O1G8xSy14sRE6Ls2a6opRo7OE90jTESuvFge/TJq\nG3GzApIEDk7Sf/cVhwjgo2wwajAOBgNVHQ8BAf8EBAMCAgQwDAYDVR0TAQH/BAIw\nADAdBgNVHQ4EFgQUlF6Ndc38jvQfZqoiLKTRSsPZHIIwKwYDVR0jBCQwIoAgsKWn\nPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMwCgYIKoZIzj0EAwIDSAAwRQIh\nAMJilFPdkTsGYYXyRrqKqC69OIIrVdERhUm+DuJNKnGiAiASZWwVxHQCM+zniuKz\nfka8oLlP5qPeefBKW8CruV1Rzg==\n-----END CERTIFICATE-----\n"},"nonce":{"type":"Buffer","data":[162,94,185,37,84,27,79,1,97,219,219,180,254,64,132,36,90,229,28,126,139,36,11,14]}}},"data":{"actions":[{"header":{"creator":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN CERTIFICATE-----\nMIIB7zCCAZWgAwIBAgIUNLc4T4ZCmXhsM1Fgooi4FMSFNe4wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjE2MTMwMTAwWhcNMTgwNjE2MTMw\nMTAwWjAOMQwwCgYDVQQDEwNKaW0wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARg\nwqB1kG2Bn5yrMRqQN59KHOI2O1G8xSy14sRE6Ls2a6opRo7OE90jTESuvFge/TJq\nG3GzApIEDk7Sf/cVhwjgo2wwajAOBgNVHQ8BAf8EBAMCAgQwDAYDVR0TAQH/BAIw\nADAdBgNVHQ4EFgQUlF6Ndc38jvQfZqoiLKTRSsPZHIIwKwYDVR0jBCQwIoAgsKWn\nPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMwCgYIKoZIzj0EAwIDSAAwRQIh\nAMJilFPdkTsGYYXyRrqKqC69OIIrVdERhUm+DuJNKnGiAiASZWwVxHQCM+zniuKz\nfka8oLlP5qPeefBKW8CruV1Rzg==\n-----END CERTIFICATE-----\n"},"nonce":{"type":"Buffer","data":[162,94,185,37,84,27,79,1,97,219,219,180,254,64,132,36,90,229,28,126,139,36,11,14]}},"payload":{"chaincode_proposal_payload":{"input":"\n$\b\u0001\u0012\u0006\u0012\u0004mycc\u001a\u0018\n\u0006invoke\n\u0004move\n\u0001a\n\u0001b\n\u000210"},"action":{"proposal_response_payload":{"proposal_hash":"b07d7721b74f5e0ad948648c514797e395b9cf53a9bc56d3dd5f397ec01fa1ed","extension":{"results":{"data_model":0,"ns_rwset":[{"namespace":"lscc","rwset":{"reads":[{"key":"mycc","version":{"block_num":{"low":1,"high":0,"unsigned":true},"tx_num":{"low":0,"high":0,"unsigned":true}}}],"range_queries_info":[],"writes":[]}},{"namespace":"mycc","rwset":{"reads":[{"key":"a","version":{"block_num":{"low":1,"high":0,"unsigned":true},"tx_num":{"low":0,"high":0,"unsigned":true}}},{"key":"b","version":{"block_num":{"low":1,"high":0,"unsigned":true},"tx_num":{"low":0,"high":0,"unsigned":true}}}],"range_queries_info":[],"writes":[{"key":"a","is_delete":false,"value":"90"},{"key":"b","is_delete":false,"value":"210"}]}}]},"events":{"chaincode_id":"","tx_id":"","event_name":"","payload":{"type":"Buffer","data":[]}},"response":{"status":200,"message":"","payload":""}}},"endorsements":[{"endorser":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN -----\nMIICWjCCAgGgAwIBAgIRAPGLVnARPOpXbAd4X38Sg60wCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjAxMTQxNzI2WhcNMjcwNTMwMTQxNzI2\nWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMS5leGFtcGxlLmNvbTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABP68ne3e/ND5mJbQBgD/uFJai+6pND7p\nsucoOuQh7onYKt7YGafxUPTleAIdtM0BXUpvfcG8T612Qe0wOz/+VbyjgY0wgYow\nDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQC\nMAAwKwYDVR0jBCQwIoAgsKWnPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMw\nKAYDVR0RBCEwH4IWcGVlcjAub3JnMS5leGFtcGxlLmNvbYIFcGVlcjAwCgYIKoZI\nzj0EAwIDRwAwRAIgbQiRzF3Y1NKEHOy809ZHLLj8KS535l4p5W9kWBUjr/0CICYs\ny2MGqiWbH8EV/J3viNR25QL8yniybnfdCGrJKZWy\n-----END -----\n"},"signature":{"type":"Buffer","data":[48,68,2,32,1,214,86,206,84,180,130,208,63,161,245,73,165,182,182,133,11,5,217,95,157,252,81,75,132,145,31,96,167,113,147,198,2,32,96,251,10,164,122,252,80,205,32,214,85,249,233,160,133,62,68,47,130,82,206,168,3,44,164,38,68,183,82,73,232,33]}},{"endorser":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN -----\nMIICWjCCAgGgAwIBAgIRAPxYG1oPao/E8U8Lyvr5U3MwCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjAxMTQxNzI2WhcNMjcwNTMwMTQxNzI2\nWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjEub3JnMS5leGFtcGxlLmNvbTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOtQO5PNelHBjyYXsP1J9r3d6qv/xMpX\n70w5g/wRFTzdDU78sVsOmiEShPIU7Klf3sv7nhwcqHapgly/n5AnjqqjgY0wgYow\nDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQC\nMAAwKwYDVR0jBCQwIoAgsKWnPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMw\nKAYDVR0RBCEwH4IWcGVlcjEub3JnMS5leGFtcGxlLmNvbYIFcGVlcjEwCgYIKoZI\nzj0EAwIDRwAwRAIgJ0/jdJFdQSHEG/mY1xhefSur0kOqomwT85Ngvxjk2UQCIBBF\ndjbzrCMPYOUHxLMJ94gXIpKgE3ReHec1fCBcsty7\n-----END -----\n"},"signature":{"type":"Buffer","data":[48,69,2,33,0,179,53,0,99,27,119,155,180,132,240,15,64,4,1,169,166,234,22,27,66,97,167,13,140,57,123,118,170,178,213,117,55,2,32,8,251,185,112,243,125,30,245,236,167,153,254,58,106,137,165,249,191,160,217,77,110,219,108,33,3,144,49,143,81,71,42]}}]}}}]}}}]},"metadata":{"metadata":[{"value":"","signatures":[{"signature_header":{"creator":{"Mspid":"OrdererMSP","IdBytes":"-----BEGIN -----\nMIICTTCCAfOgAwIBAgIRAPgOpt3+Nfk+01sMdz6kzN4wCgYIKoZIzj0EAwIwaTEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\ncGxlLmNvbTAeFw0xNzA2MDExNDE3MjZaFw0yNzA1MzAxNDE3MjZaMFgxCzAJBgNV\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\nc2NvMRwwGgYDVQQDExNvcmRlcmVyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI\nKoZIzj0DAQcDQgAENf3ZkpKtXwTy9erYtMCBYeeSU/4u996yTkzYABFRjJUCPHJF\nLBZjSf2RSLZ8dlEN9FlP6amXuMy6ESmlJr/5eqOBjDCBiTAOBgNVHQ8BAf8EBAMC\nBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAi\ngCDKy+d5gMYuWR00XMdeft2au4DqZ8BUogACgPt3Vq5ihjAnBgNVHREEIDAeghNv\ncmRlcmVyLmV4YW1wbGUuY29tggdvcmRlcmVyMAoGCCqGSM49BAMCA0gAMEUCIQD6\n5QcBFKKi6z8PTr4aXG+y0f6/xDS1MsG+iObnwGJntwIgROOBaIgOsYWqF4RAsTTk\n3UbaTPHBRgfC9n1ikfF4jHA=\n-----END -----\n"},"nonce":{"type":"Buffer","data":[55,114,35,43,55,236,240,19,29,148,206,31,37,186,133,193,185,113,21,111,220,13,245,114]}},"signature":{"type":"Buffer","data":[48,68,2,32,100,57,88,147,254,14,203,244,186,35,180,73,41,65,188,19,111,217,239,167,180,38,49,172,82,203,250,251,198,36,15,106,2,32,125,121,136,118,156,56,132,60,100,76,232,215,5,247,105,147,216,87,105,55,216,182,209,233,211,182,6,109,160,31,83,124]}}]},{"value":{"index":{"low":0,"high":0,"unsigned":true}},"signatures":[{"signature_header":{"creator":{"Mspid":"OrdererMSP","IdBytes":"-----BEGIN -----\nMIICTTCCAfOgAwIBAgIRAPgOpt3+Nfk+01sMdz6kzN4wCgYIKoZIzj0EAwIwaTEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\ncGxlLmNvbTAeFw0xNzA2MDExNDE3MjZaFw0yNzA1MzAxNDE3MjZaMFgxCzAJBgNV\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\nc2NvMRwwGgYDVQQDExNvcmRlcmVyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI\nKoZIzj0DAQcDQgAENf3ZkpKtXwTy9erYtMCBYeeSU/4u996yTkzYABFRjJUCPHJF\nLBZjSf2RSLZ8dlEN9FlP6amXuMy6ESmlJr/5eqOBjDCBiTAOBgNVHQ8BAf8EBAMC\nBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAi\ngCDKy+d5gMYuWR00XMdeft2au4DqZ8BUogACgPt3Vq5ihjAnBgNVHREEIDAeghNv\ncmRlcmVyLmV4YW1wbGUuY29tggdvcmRlcmVyMAoGCCqGSM49BAMCA0gAMEUCIQD6\n5QcBFKKi6z8PTr4aXG+y0f6/xDS1MsG+iObnwGJntwIgROOBaIgOsYWqF4RAsTTk\n3UbaTPHBRgfC9n1ikfF4jHA=\n-----END -----\n"},"nonce":{"type":"Buffer","data":[232,75,153,152,127,237,61,253,104,27,97,201,8,10,69,39,25,105,48,228,9,145,186,76]}},"signature":{"type":"Buffer","data":[48,68,2,32,110,209,136,243,215,85,58,109,143,69,201,5,41,112,191,134,229,34,26,6,123,254,37,186,238,54,56,40,185,255,138,120,2,32,70,54,73,69,1,36,130,77,94,38,33,159,225,145,135,70,94,217,55,78,35,234,33,58,187,251,231,168,56,166,24,210]}}]},[]]}}
1トランザクションを含んだブロックのデータサイズが予想以上に大きい。。。
2017年6月15日木曜日
Hyperledger Fabric V1.0 β のインストール方法
ブロックチェーン基盤であるFabric V1.0 β のインストール方法について説明する。
Ubuntu OSには、Dockcer及びDocker-composeをインストール済みであること。
(参照元URL)
https://hyperledger-fabric.readthedocs.io/en/latest/getting_started.html
Ubuntu OSには、Dockcer及びDocker-composeをインストール済みであること。
(参照元URL)
https://hyperledger-fabric.readthedocs.io/en/latest/getting_started.html
- Ubuntu OSにTeratermでログインする。
- 以下のフォルダを作成する。
$ mkdir fabric-sample$ cd fabric-sample - 以下のコマンドを実行する。このコマンドを実行すると、インストールに必要なパッケージをダウンロードしてくれる。(結構時間がかかる)
$curl -sSL https://goo.gl/LQkuoh | bash - docker imagesコマンドでFabricイメージがダウンロードされていることを確認する。
- configtxgentツールを使うと、Fabricを動かすために必要となる以下の4つの設定情報ファイルを自動的に作成してくれる。
・bootstrap block
・チャネルトランザクション
・2つのアンカーPeerトランザクション
まず、bootstrap blockを作成するために、以下のコマンドを実行する。
$ cd release/linux-amd64/
$ ./bin/cryptogen generate --config=./crypto-config.yaml
以下の警告が大量に出力されるが無視する。
[bccsp] GetDefault -> WARN 001 Before using BCCSP, please call InitFactories(). Falling back to bootBCCSP. - 次に、チャネルトランザクションを作成する。
$ export FABRIC_CFG_PATH=$PWD
$ ./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
$ ./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel2017-06-15 23:31:19.449 JST [common/configtx/tool] main -> INFO 001 Loading configuration
2017-06-15 23:31:19.460 JST [common/configtx/tool] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
2017-06-15 23:31:19.461 JST [common/configtx/tool] doOutputChannelCreateTx -> INFO 003 Writing new channel tx - Org1という組織にアンカーPeerを登録する。
$ ./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
2017-06-05 22:28:12.620 JST [common/configtx/tool] main -> INFO 001 Loading configuration
2017-06-05 22:28:12.625 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2017-06-05 22:28:12.625 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
同様に、Org2という組織にアンカーPeerを登録する。
$ ./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychnnel -asOrg Org2MSP
2017-06-05 22:30:01.798 JST [common/configtx/tool] main -> INFO 001 Loading configuration
2017-06-05 22:30:01.805 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2017-06-05 22:30:01.805 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update - 以下のコマンドを実行する。
$ ./generateArtifacts.sh mychannel - docker-compose-cli.yamlをviで開いて、以下をbashコマンドをコマンドアウトする。
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
# command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
volumes: - クライアントのDockerコンテナを起動する。
$ CHANNEL_NAME=mychannel TIMEOUT=60 docker-compose -f docker-compose-cli.yaml up -d - docker psコマンドを実行し、cliというコンテナが起動していることを確認する。
- cliコンテナにログインする。
$ docker exec -it cli bash - 「mychannel」というチャネルを作成する。
$ CHANNEL_NAME=mychannel
# peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem - 「mychannel」チャネルに「peer0.org1.example.com」を追加する。
$ peer channel join -b mychannel.block - Fabric付属のexample02というチェーンコードをインストールする。
$ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 - チェーンコードをイニシエトする。
$ peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')" - aという値をクエリしてみる。
$peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
・・・
Query Result: 100
・・・ - チェーンコードをinvokeして、aからbに10資産移動させる。
$ peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'
aの資産が90になっていることを確認する。
$peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
・・・
Query Result: 90
・・・
bの資産が110になっていることを確認する。
$peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","b"]}'
・・・
Query Result: 110
・・・
登録:
投稿 (Atom)