Hyperledger Fabric をDockerHub のイメージを使用して試してみる

技術メモ

Hyperledger Fabric に最近興味を持ち始めたので、チュートリアルのような記事をまずやってみる。

Docker for Mac で Hyperledger Fabric の開発環境を立ち上げる

基本的に上記の記事にそっていっただけ。

Hyperledger Fabricとは?

Hyperledger Fabric (ハイパーレッジャーファブリック, 以下 Fabric) は、そんな Hyperledger プロジェクトの元で開発されているブロックチェーン基盤の一つであり、オープンソースなので誰でも利用することができる。

インストール手順

Docker (1.11 以降) をインストールしておく。
当方はmacOS 10.11.6(15G1217)。

Docker イメージインストール

$ docker pull hyperledger/fabric-peer:latest
$ docker pull hyperledger/fabric-membersrvc:latest

Docker composer で起動

$ mkdir ~/docker/hyperledger
$ cd ~/docker/hyperledger
$ vi docker-compose.yml
-----
membersrvc:
  image: hyperledger/fabric-membersrvc
  command: membersrvc
vp0:
  image: hyperledger/fabric-peer
  environment:
    - CORE_PEER_ADDRESSAUTODETECT=true
    - CORE_VM_ENDPOINT=http://172.17.0.1:2375
    - CORE_LOGGING_LEVEL=DEBUG
    - CORE_PEER_ID=vp0
    - CORE_PEER_PKI_ECA_PADDR=membersrvc:7054
    - CORE_PEER_PKI_TCA_PADDR=membersrvc:7054
    - CORE_PEER_PKI_TLSCA_PADDR=membersrvc:7054
    - CORE_SECURITY_ENABLED=true
    - CORE_SECURITY_ENROLLID=test_vp0
    - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT
  links:
    - membersrvc
  command: sh -c "sleep 5; peer node start --peer-chaincodedev"
-----
$ docker-compose up
Starting hyperledger_membersrvc_1
Starting hyperledger_vp0_1
Attaching to hyperledger_membersrvc_1, hyperledger_vp0_1

稼働状況の確認

$ docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS               NAMES
95eaecf48b39        hyperledger/fabric-peer         "sh -c 'sleep 5; p..."   5 minutes ago       Up 33 seconds                           hyperledger_vp0_1
d33c2a12e836        hyperledger/fabric-membersrvc   "membersrvc"             5 minutes ago       Up 33 seconds                           hyperledger_membersrvc_1

Dockerの中に入る

$ docker exec -it hyperledger_vp0_1 bash

起動したコンテナ上でいろいろためす

docker内の membersrvc/membersrvc.yaml にログイン情報がのっているので、それでログインしてみる

# curl -X POST -H 'Content-Type: application/json' -d '{"enrollId":"jim","enrollSecret":"6avZQLwcUe9b"}' http://localhost:7050/registrar
{"OK":"Login successful for user 'jim'."}

Chaincode API でのチェーンコード設置・実行・参照

chaincode_example02.go というサンプルを実行する

$ cd /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
$ go build

そして実行・・・、一応うまく行ったみたい。

$ CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02
06:39:26.811 [shim] DEBU : Peer address: 0.0.0.0:7051
06:39:26.813 [shim] DEBU : os.Args returns: [./chaincode_example02]
06:39:26.814 [shim] DEBU : Registering.. sending REGISTER
06:39:26.819 [shim] DEBU : []Received message REGISTERED from shim
06:39:26.819 [shim] DEBU : []Handling ChaincodeMessage of type: REGISTERED(state:created)
06:39:26.819 [shim] DEBU : Received REGISTERED, ready for invocations

下記を実行して登録したチェーンコードをデプロイ。
初期値として a に 1000、b に 2000 をセット。

echo '{
  "jsonrpc": "2.0",
  "method": "deploy",
  "params": {
    "type": 1,
    "chaincodeID": {
      "name": "mycc"
    },
    "ctorMsg": {
      "function": "init",
      "args": ["a", "1000", "b", "2000"]
    },
    "secureContext": "jim"
  },
  "id": 1
}' | 
curl -X POST -H 'Content-Type: application/json' -d @- http://localhost:7050/chaincode
{"jsonrpc":"2.0","result":{"status":"OK","message":"mycc"},"id":1}

invokeしてみる。a から b に 100 を渡すような処理。

# echo '{
>   "jsonrpc": "2.0",
>   "method": "invoke",
>   "params": {
>     "type": 1,
>     "chaincodeID": {
>       "name": "mycc"
>     },
>     "ctorMsg": {
>       "function": "invoke",
>       "args": ["a", "b", "100"]
>     },
>     "secureContext": "jim"
>   },
>   "id": 1
> }' |
> curl -X POST -H 'Content-Type: application/json' -d @- http://localhost:7050/chaincode
{"jsonrpc":"2.0","result":{"status":"OK","message":"0bc2b05c-114a-490e-a949-c53f5308f357"},"id":1}

最後に、query で処理が正常に完了したかを確認。

echo '{
>   "jsonrpc": "2.0",
>   "method": "query",
>   "params": {
>     "type": 1,
>     "chaincodeID": {
>       "name": "mycc"
>     },
>     "ctorMsg": {
>       "function": "query",
>       "args": ["a"]
>     },
>     "secureContext": "jim"
>   },
>   "id": 1
> }' |
> curl -X POST -H 'Content-Type: application/json' -d @- http://localhost:7050/chaincode

{"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}

っと、エラーが発生。

どうもdeploy時に以下のエラーがpeerサーバー側で発生していたので

06:53:30.444 [chaincode] Launch -> ERRO 137f sending init failed(handler not found for chaincode mycc)

[開発] Hyplerledger Fabric でのトラブルをシューティング の記事を参照すると
“アプリがコンテナが起動していない為コンソールログにはOKと出るが、実際にはledgerに登録できておらず、queryすると以下の例外が返る。”
とのこと。
そういえば、chaincode_example02 をとめてしまっていたなと思い、

CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02

を実行したあとに、再度 deployするとエラーログが発生しなくなった。
そして、invokeも再度する。こちらも問題なし。
先ほど失敗したqueryをいよいよ実行すると・・・

# echo '{
>   "jsonrpc": "2.0",
>   "method": "query",
>   "params": {
>     "type": 1,
>     "chaincodeID": {
>       "name": "mycc"
>     },
>     "ctorMsg": {
>       "function": "query",
>       "args": ["a"]
>     },
>     "secureContext": "jim"
>   },
>   "id": 1
> }' |
> curl -X POST -H 'Content-Type: application/json' -d @- http://localhost:7050/chaincode
{"jsonrpc":"2.0","result":{"status":"OK","message":"900"},"id":1}

成功した !

$ echo '{
>   "jsonrpc": "2.0",
>   "method": "query",
>   "params": {
>     "type": 1,
>     "chaincodeID": {
>       "name": "mycc"
>     },
>     "ctorMsg": {
>       "function": "query",
>       "args": ["b"]
>     },
>     "secureContext": "jim"
>   },
>   "id": 1
> }' |
> curl -X POST -H 'Content-Type: application/json' -d @- http://localhost:7050/chaincode
{"jsonrpc":"2.0","result":{"status":"OK","message":"2100"},"id":1}

こちらも成功。
a を指定すると結果は 900 に、b を指定すると結果は 2100 になった。

一通り試してみたが、それぞれのコマンドやらやってる事の意味がいまいち理解できていないので、それぞれの意味を次から理解していく。

参考URL

Docker for Mac で Hyperledger Fabric の開発環境を立ち上げる
オープンソースのブロックチェーン Hyperledger Fabric を試してみる
IBM ブロックチェーンの基礎: 開発者向けクイック・スタート・ガイド
[開発] Hyplerledger Fabric でのトラブルをシューティング

Sponsored Link

ビットコイン(Bitcoin)、イーサリアム(Ethereum)、リップル(Ripple)、ネム(NEM)などの仮想通貨を買うならZaifがおすすめです。

特に国内でETHを購入するなら、アルトコインでも板取引に対応しているZaif(ザイフ)が割安なのでよいですよ。

コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Ethereum(イーサリアム)
Ethereumの開発用ツールリストが公開されていた!

ALISのCTO石井さんがつぶやいてたんですが とてもありがたい #Ethereum 開発ツールの一 …

技術メモ
Counterpartyの環境構築が大変という話

暗号通貨の独自通貨を作ろうとするとEthereumが有名で簡単ですが、BitcoinでもCounte …

Ethereum(イーサリアム)
Error: The contract code couldn’t be stored, please check your gas amount.

ALISのICOソースのzeppelinバージョンを1.2から1.8にあげようとしたときにはまったエ …