[開発] Hyplerledger Fabric でのトラブルをシューティング



==============================
1
2016/11/11
基礎知識
ちなみにの
そもそも
fabricの実行方法

原因・対処

"CLIを使うかRESTを使うかの大きく2つある。
CLIで実行する場合はTerminalを起動して実行する。
RESTを使用する場合は、Terminalからでも実行できるし、Postman等のREST Clientを経由しても実行できる。
"

==============================
2
2016/11/11
基礎知識
ちなみにの
そもそも
CLIとは

原因・対処

"# peer chaincode..などのfabric提供のコマンドをterminal/teraterm等から直に実行すること。
ローカルでもHOSTVMでもdockerコンテナ内でもfabricが導入できていれば実行可能。
Dockerでpullしてくるpeerのイメージには既にfabricが構築されているので間違いなく実行可能。
HOSTVMにfabric入れる場合は、golangやgit等の基本資材に加えfabric使用する為の環境構築が必要になる。Vagrant/VirtualBoxが使用できる環境であれば容易に構築可能。
"

==============================
3
2016/11/11
基礎知識
ちなみにの
そもそも
RESTとは

原因・対処

"HTTPなどでアクセスしてコンテンツを取得できるcURLコマンドを使用してピアコンテナと通信して実行すること。fabricが導入されていない環境からの実行も可能になる。加え、ピアコンテナ内からも実行可能。
cf. cURLコマンド
http://www.hcn.zaq.ne.jp/___/unix/curl_manual.html
cf. cURLのバージョン確認
$ curl --version"

==============================
4
2016/11/11
基礎知識
ちなみにの
そもそも
cURLコマンドで投げている文字列の意味が分からない

原因・対処

"基本形:curl [option] URL
-X = HTTP サーバとの通信の際に用いる独自のリクエストメソッドを指定するオプション
-H =HTTPリクエストのヘッダ情報を指定するオプション
-d =POST リクエストで渡すデータを指定するオプション
e.g. curl -X POST -H 'Content-Type: application/json' -d 'piyo' http://localhost:7050/hoge

コマンド出力をcURLでPOSTするやり方を取れば、改行を含ませた記述方法も可能になる。
@の後はファイル名を記載するがコマンド出力を読ます場合はファイル名の代わりに「-」と記載する。
e.g. echo ""foo\nbar\nbaz"" | curl --data-binary @- 'http://localhost:6666/'
ref. http://qiita.com/edvakf@github/items/fb5c2f55292218a5446d"

==============================
5
2016/11/8
docker compose
HOST VMで
docker-composeを起動しようとして
"user1@VM05:~/handon$ docker-compose up -d
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable."

原因・対処

"sudo usermod -aG docker user1
した後に一度ログアウトする必要があるのにしていない為の事象。
→ 一度TeraTermを出て再ログイン。"

==============================
6
2016/11/9
docker compose
HOST VMで
docker-compose経由でCAとPeerを起動しようとして
"Peerのdockerログに例外が出た。
[crypto] Errorf -> ERRO 021 [validator.test_vp0] Failed requesting read certificate [rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure].
[crypto] Errorf -> ERRO 022 [validator.test_vp0] Failed requesting ECA certificate [rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure].
2016/11/09 05:08:34 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = ""transport: dial tcp: lookup ca on 168.63.129.16:53: no such host""; Reconnecting to {""ca:7054"" }
2016/11/09 05:08:34 Failed to dial ca:7054: grpc: the connection is closing; please retry."

原因・対処

"docker-compose.yml
peer>CORE_PEER_PKI_ECA_PADDRで指定しているホスト名が誤っている為。
CORE_PEER_PKI_ECA_PADDRで指定するホスト名はmembersrvcのcontainer_nameと一致していること。
加え、peerからCAへのlinksも定義されていること。
→ docker-compose定義ファイルの修正"

==============================
7
2016/11/8
"peer
node"
ピアコンテナ内で
peer node stop
"コンソールログ
05:44:54.512 [nodeCmd] stop -> INFO 002 Stopping peer using grpc
2016/11/08 05:44:54 transport: http2Client.notifyError got notified that the client transport was broken EOF.

Dockerログ
[server] StopServer -> DEBU 6752 returning status: status:STOPPED
[server] StopServer -> DEBU 6753 Remove pid file /var/hyperledger/production/peer.pid"

原因・対処

"特に対応は不要。
コンソールログにbrokenとあるかるが、dockerログの通りプロセスのpidファイルを削除できている。"

==============================
8
2016/11/9
"peer
chain"
HOST VMで
"chainの長さを見ようとして
"
"$ curl 172.17.0.2:7050/chain
curl: (7) Failed to connect to 172.17.0.2 port 7050: Connection refused
$ curl 172.17.0.2:7054/chain
curl: (56) Recv failure: Connection reset by peer"

原因・対処

"接続先情報が違うから。
$ docker logs で起動ログから以下のINFOログを見つける。
[nodeCmd] serve -> INFO 080 Starting peer with ID=name:""vp0"" , network ID=dev, address=172.17.0.3:7051, rootnodes=, validator=true
[rest] StartOpenchainRESTServer -> INFO 081 Initializing the REST service on 0.0.0.0:7050, TLS is disabled.
restが出力している「0.0.0.0:7050」が接続先になる。
(同アドレスは、fabric/peer/core.yamlの値が参照されている。)

加え、そのportがコンテナ外部からアクセス可能なportとして定義されていること。=docker-compose.ymlのpeer>portsで定義されていること。

→ 「$ curl 0.0.0.0:7050/chain」で再実行
「$ curl localhost:7050/chain」でも同じ。

※ もし、docker-compose.yml で peer の環境変数 CORE_VM_ENDPOINT をIPで指定している場合は、以下の様にそのIPでも実行できる。
$ curl 172.17.0.1:7050/chain

"
"ref.
curl err list --> https://curl.haxx.se/libcurl/c/libcurl-errors.html
curl cmd list --> curlコマンドで覚えておきたい使い方12個
Hyperledger fabricでchaincodeの開発環境を構築する --> http://qiita.com/tyasu/items/92c2033cf3199a80cb67"
==============================
9
2016/11/10
"user
login
REST"
HOST VMから
"RESTで
ログインしようとして
"
"user1@VM05:~/handson$ curl -X POST -H 'Content-Type: application/json' -d '{""enrollId"":""jim"",""enrollSecret"":""6avZQLwcUe9b""}' http://localhost:7050/registrar

コンソールログ
curl: (52) Empty reply from server"

原因・対処

"時間の問題。Peerが起動し切れていない段階でログインしようとした為に発生する例外。
※ docker-compose.yml > peer > CORE_SECURITY_ENABLED=true が設定さていること"

==============================
10
2016/11/11
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"peer chaincode deploy -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'

コンソール
Error: Must supply value for chaincode path parameter.
"

原因・対処

"peerは、①コマンドのスキーマチェック、②ログイン状態チェック、③各オプションの実行と処理を進める。
これはchaincodeのスキーマチェックでの例外で、chaincodeが使用する nフラグか pフラグを指定する。
e.g.
peer chaincode deploy -n mycc -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'"

==============================
11
2016/11/9
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"# peer chaincode deploy -n mycc -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'

コンソール
Error: Must supply username for chaincode when security is enabled"

原因・対処

"peer セキュリティ有効で起動している為にユーザ情報なしではCC実行できない。
手段①
docker-compose の peer の CORE_SECURITY 系の項目を軒並み無効にした peer コンテナに作り直す。
手段②
ログイン情報を入れて実行する。 Cf. fabric/membersrvc/membersrvc.yaml : eca > users > lukas, diego, jim, binhnなりを u フラグでchaincodeコマンドの引数で渡す。
e.g. peer chaincode deploy -u jim -n mycc -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'

"

==============================
12
2016/11/9
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"peer chaincode deploy -u jim -n mycc -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'

コンソール
Error: User 'jim' not logged in. Use the 'peer network login' command to obtain a security token."

原因・対処

"peer セキュリティ有効で起動している為にログインなしではCC実行できない。
一度コンテナを作り直した場合はユーザログインからすること"

==============================
13
2016/11/10
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"# peer chaincode deploy -u jim -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{""Function"":""init"", ""Args"": [""a"",""100"", ""b"", ""200""]}'

コンソール
Deploy chaincode:
09:48:57.767 [main] main -> INFO 003 Exiting.....

ピアdocker ログ
09:48:58.632 [chaincode] Launch -> ERRO 03d sending init failed(handler not found for chaincode )
09:48:58.632 [chaincode] Launch -> ERRO 03e stop failed chaincode name not set(Failed to init chaincode(handler not found for chaincode ))
"

原因・対処

"開発モードでpeerを起動している場合は、デプロイするチェーンコードの名称を指定する必要がある。
以下のように n フラグを足せば「name not set」のエラーは消える。

e.g.
peer chaincode deploy -u jim -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{""Function"":""init"", ""Args"": [""a"",""100"", ""b"", ""200""]}'

※ ピアコンテナCLIでデプロイした場合は、「curl localhost:7050/chain」でheight数が増加するが、CCクエリすると失敗しているのが分かる。
"

==============================
14
2016/11/11
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"peer chaincode deploy -u jim -l golang -n mycc2 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{""Function"":""init"", ""Args"":[ ""c"", ""2000"", ""d"", ""1000""] }'

ピアdockerログ
[chaincode] Launch -> ERRO 042 sending init failed(handler not found for chaincode mycc2)"

原因・対処

"コマンド引数で渡しているCCの名称が、docker-compose.yam > app* > CORE_CHAINCODE_ID_NAME に定義したCCの名称と一致していない為のもの。

* StarterKitであればstarterコンテナの定義部分"

==============================
15
2016/11/10
"cc
deploy
REST"
HOSTVMから
"RESTでCCデプロイしようとして
"
"コンソールログ
{""jsonrpc"":""2.0"",""result"":{""status"":""OK"",""message"":""mycc""},""id"":1}
user1@VM05:~/handson$

docker ログ
[chaincode] Launch -> ERRO 031 sending init failed(handler not found for chaincode mycc)"

原因・対処

"アプリがコンテナが起動していない為
コンソールログにはOKと出るが、実際にはledgerに登録できておらず、queryすると以下の例外が返る。
"

==============================
16
2016/11/11
"cc
deploy
REST"
HOSTVMで
"RESTで
CCデプロイしようとして"
{"jsonrpc":"2.0","error":{"code":-32000,"message":"Registration missing","data":"User not logged in. Use the '/registrar' endpoint to obtain a security token."},"id":1}

原因・対処

"ユーザのログインをせずにchaincodeを実行しようとしている為の例外。先にログインすべき。
RESでのログイン方法
curl -X POST -H 'Content-Type: application/json' -d '{""enrollId"":""jim"",""enrollSecret"":""6avZQLwcUe9b""}' http://localhost:7050/registrar
CLIでのログイン方法
$ docker exec -it vp0 /bin/bash
# peer network login jim -p 6avZQLwcUe9b"

==============================
17
2016/11/11
"cc
deploy
REST"
ピアコンテナで
"RESTで
CCデプロイしようとして"
Error: User 'jim' not logged in. Use the 'peer network login' command to obtain a security token.

原因・対処

"セキュリティを有効にしているので、デプロイする前にログインが必要。
以下のログインコマンドをHOSTVMで実施してからデプロイする。
curl -X POST -H 'Content-Type: application/json' -d '{""enrollId"":""jim"",""enrollSecret"":""6avZQLwcUe9b""}' http://localhost:7050/registrar"

==============================
18
2016/11/11
"cc
deploy
REST"
HOSTVMで
"RESTで
CCデプロイしようとして"
"コンソール
{""jsonrpc"":""2.0"",""error"":{""code"":-32602,""message"":""Invalid params"",""data"":""Chaincode name may not be blank in development mode.""},""id"":0}"

原因・対処

"params > chaincodeID > name項目が抜けている。

TOBE:
""chaincodeID"": {
""name"": ""mycc"",
""path"": ""github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02""
},
"

==============================
19
2016/11/11
"cc
deploy
REST"
HOSTVMで
"RESTで
CCデプロイしようとして"
"コンソール
{""jsonrpc"":""2.0"",""error"":{""code"":-32602,""message"":""Invalid params"",""data"":""Must supply username for chaincode when security is enabled.""},""id"":0}
ピアdockerログ
04:54:38.081 [rest] ProcessChaincode -> INFO 02d REST processing chaincode request...
04:54:38.081 [rest] processChaincodeDeploy -> INFO 02e REST deploying chaincode...
04:54:38.081 [rest] processChaincodeDeploy -> ERRO 02f Must supply username for chaincode when security is enabled.
04:54:38.081 [rest] ProcessChaincode -> INFO 030 REST successfully deploy chaincode: {""jsonrpc"":""2.0"",""error"":{""code"":-32602,""message"":""Invalid params"",""data"":""Must supply username for chaincode when security is enabled.""},""id"":0}"

原因・対処

"params > secureContext項目が抜けている。

TOBE:
""params"": {
中略
""secureContext"": ""jim""
},
"

==============================
20
2016/11/10
"cc
query
REST"
HOSTVMから
"RESTで
CCをクエリしようとして
"
"コンソールログ
{""jsonrpc"":""2.0"",""error"":{""code"":-32003,""message"":""Query failure"",""data"":""Error when querying chaincode: Error:Failed to launch chaincode spec(Could not get deployment transaction for mycc - LedgerError - ResourceNotFound: ledger: resource not found)""},""id"":1}

ピアdockerログ
08:17:06.785 [chaincode] Launch -> ERRO 038 You are attempting to perform an action other than Deploy on Chaincode that is not ready and you are in developer mode. Did you forget to Deploy your chaincode?
08:17:06.785 [crypto] closeClientInternal -> INFO 039 Closing client [jim]...
08:17:06.849 [rest] processChaincodeInvokeOrQuery -> ERRO 03a Error when querying chaincode: Error:Failed to launch chaincode spec(Could not get deployment transaction for mycc - LedgerError - ResourceNotFound: ledger: resource not found)"

原因・対処

"CCのデプロイにそもそも失敗している。
Docker-composeにアプリを定義し、アプリに以下の開発モードで実行する際に必要な環境が変数が設定されていること。
- DEPLOY_MODE=dev
- CORE_CHAINCODE_ID_NAME=mycc
- CORE_PEER_ADDRESS=vp0:7051

アプリに必要な最小限な設定
myapp:
container_name: app
image: hyperledger/fabric-starter-kit
environment:
- DEPLOY_MODE=dev
- CORE_CHAINCODE_ID_NAME=mycc
- CORE_PEER_ADDRESS=vp0:7051
command: sh -c ""sleep 20; /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02""
links:
- myca
- myvp0
"

==============================
使用したdocker-compose.yml

myca:
# try 'docker ps' to see the container status after starting this compose
container_name: ca
image: hyperledger/fabric-membersrvc
# ports:
# - "7054:7054"
command: membersrvc

myvp0:
container_name: vp0
image: hyperledger/fabric-peer
ports:
# the ports allow access from outside container. alson, not needed when run a single container.
- "7050:7050"
- "7051:7051"
- "7053:7053"
environment:
- CORE_PEER_ADDRESSAUTODETECT=true
# comment in either one. both will give you a same result.
# 172.17.0.1 is a default docker0 bridge ip. see /etc/local/docker>DOCKER_OPTS for relevant setting.
- CORE_VM_ENDPOINT=unix:///var/run/docker.sock
# - CORE_VM_ENDPOINT=http://172.17.0.1:2375
- CORE_LOGGING_LEVEL=INFO
- CORE_PEER_ID=vp0
- CORE_PEER_PKI_ECA_PADDR=ca:7054
- CORE_PEER_PKI_TCA_PADDR=ca:7054
- CORE_PEER_PKI_TLSCA_PADDR=ca:7054
- CORE_SECURITY_ENABLED=true
# - CORE_SECURITY_ENROLLID=test_vp0
# - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT
# choose either: noops or pbft
- CORE_PEER_VALIDATOR_CONSENSUS_PLUGIN=noops
# this gives access to the docker host daemon to deploy chain code in network mode
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# have the peer wait 10 sec for membersrvc to start
# the following is to run the peer in Developer mode - also set sample DEPLOY_MODE=dev
command: sh -c "sleep 10; peer node start --peer-chaincodedev"
#command: sh -c "sleep 10; peer node start"
links:
- myca

# refer to hyperledger/fabric/docs/Setup/Network-setup.md

myapp:
container_name: app
image: hyperledger/fabric-starter-kit
# volumes:
# # tweak this to map a local developmnt directory tree into the container
# - ~/mytest:/user/mytest
environment:
# - MEMBERSRVC_ADDRESS=membersrvc:7054
# - PEER_ADDRESS=vp0:7051
# - KEY_VALUE_STORE=/tmp/hl_sdk_node_key_value_store
# # set to following to 'dev' if peer running in Developer mode
- DEPLOY_MODE=dev
- CORE_CHAINCODE_ID_NAME=mycc
- CORE_PEER_ADDRESS=vp0:7051
# the following command will start the chain code when this container starts and ready it for deployment by the app
command: sh -c "sleep 20; /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02"
# stdin_open: true
# tty: true
links:
- myca
- myvp0

tag : Blockchain Hyperledger Fabric Starter Kit Azure Ubuntu docker compose Vagrant

2016-11-12 14:30 : 開発 : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud