dockerでhyperledger/fabricをセットアップ & Chaincode実行まで。
hyperledger/fabricを使ってchaincodeで遊ぶ
最近良く耳にするhyperledgerを手元の環境(docker)で試したくて セットアップをしたのですがややハマったので記録に残します。 このエントリが誰かの役に少しでも立てば幸いです。
docker-composeのセットアップ
dockerの元イメージとしては以下を利用しました。
https://hub.docker.com/r/yeasy/hyperledger-peer/
最終的なdocker-compose.ymlは以下にあります。
上記のdocker-compose.ymlとcommon.ymlを配置したディレクトリで
docker-compose up -d
として起動します。
起動はこれだけです。カンタンですね!
chaincodeの登録
次にchaincodeを登録するのですが、 登録するchaincodeは以下のリポジトリのサンプルをお借りしました。
ただし上記のままだとインターフェースが合わないと怒られるので、 最新のインターフェースに併せて以下のように変更しています。
これを実際に登録します。
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{ \"jsonrpc\": \"2.0\", \"method\": \"deploy\", \"params\": { \"type\": 1, \"chaincodeID\": { \"path\": \"https://github.com/cimadai/chaincode_example/example_01\" }, \"ctorMsg\": { \"function\": \"init\", \"args\": [] } }, \"id\": 1 }" "192.168.2.230:7050/chaincode"
するとログに以下のようなエラーが出てしまいました。
10:06:13.998 [dockercontroller] deployImage -> ERRO 030 Error building images: Error: image hyperledger/fabric-ccenv:x86_64- not found vp0_1 | 10:06:13.998 [dockercontroller] deployImage -> ERRO 031 Image Output: vp0_1 | ******************** vp0_1 | Step 1 : FROM hyperledger/fabric-ccenv:x86_64- vp0_1 | Pulling repository docker.io/hyperledger/fabric-ccenv
どうやらfabric-ccenvというイメージが無くて起動できないみたいなので 用意してあげる必要がありそうです。
fabric-ccenvのビルド
dockerを動かしている環境で、fabric-ccenvをビルドします。
$ git clone https://github.com/hyperledger/fabric.git $ cd fabric/ $ go get "github.com/hyperledger/fabric/core/chaincode/shim" $ sudo make peer-image
少しまつとできました。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hyperledger/fabric-peer latest 357747f2a570 45 minutes ago 1.446 GB hyperledger/fabric-peer x86_64-0.7.0-snapshot-0e69b6d 357747f2a570 45 minutes ago 1.446 GB hyperledger/fabric-javaenv latest 6a826a63c1ad 45 minutes ago 791 MB hyperledger/fabric-javaenv x86_64-0.7.0-snapshot-0e69b6d 6a826a63c1ad 45 minutes ago 791 MB hyperledger/fabric-ccenv latest e8913f28fbda 47 minutes ago 1.415 GB hyperledger/fabric-ccenv x86_64-0.7.0-snapshot-0e69b6d e8913f28fbda 47 minutes ago 1.415 GB hyperledger/fabric-src latest b7e7607659fc 47 minutes ago 1.418 GB hyperledger/fabric-src x86_64-0.7.0-snapshot-0e69b6d b7e7607659fc 47 minutes ago 1.418 GB
この状態でもういちどやってみたのですが、同じエラーで怒られてしまい上手く行きません。
FROM hyperledger/fabric-ccenv:x86_64-
エラーのこの部分に注目して、fabricのソースコード見てみると
FROM hyperledger/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION)
という部分がありました。
どうやらこの PROJECT_VERSION が取得できてないっぽいのですが、 docker-compose.ymlに PROJECT_VERSION つけたりもしたけどうまく行かなかったので ワークアラウンドとして、dockerイメージにPROJECT_VERSIONなしのtagをつけたら上手く行きました。 ※この対応、スマートなやり方があれば教えてください。
以下のようにタグを付けました。
docker tag hyperledger/fabric-ccenv:latest hyperledger/fabric-ccenv:x86_64-
こんな感じになります。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hyperledger/fabric-peer latest 357747f2a570 49 minutes ago 1.446 GB hyperledger/fabric-peer x86_64-0.7.0-snapshot-0e69b6d 357747f2a570 49 minutes ago 1.446 GB hyperledger/fabric-javaenv latest 6a826a63c1ad 49 minutes ago 791 MB hyperledger/fabric-javaenv x86_64-0.7.0-snapshot-0e69b6d 6a826a63c1ad 49 minutes ago 791 MB hyperledger/fabric-ccenv latest e8913f28fbda 50 minutes ago 1.415 GB hyperledger/fabric-ccenv x86_64- e8913f28fbda 50 minutes ago 1.415 GB hyperledger/fabric-ccenv x86_64-0.7.0-snapshot-0e69b6d e8913f28fbda 50 minutes ago 1.415 GB hyperledger/fabric-src latest b7e7607659fc 50 minutes ago 1.418 GB hyperledger/fabric-src x86_64-0.7.0-snapshot-0e69b6d b7e7607659fc 50 minutes ago 1.418 GB
これで大丈夫なはずです。
codechainの実行
再度deployをしてみる。
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{ \"jsonrpc\": \"2.0\", \"method\": \"deploy\", \"params\": { \"type\": 1, \"chaincodeID\": { \"path\": \"https://github.com/cimadai/chaincode_example/example_01\" }, \"ctorMsg\": { \"function\": \"init\", \"args\": [] } }, \"id\": 1 }" "192.168.2.230:7050/chaincode"
こんどはちゃんと成功しました。
{ "jsonrpc": "2.0", "result": { "status": "OK", "message": "da35e239025eb78d7b0af31964639ac05f3869f0ad798ef7e89432f47ce63e56e31d761dc225d982f9eea3daba12a1b04a78e817ec81e389defbf126081a76e1" }, "id": 1 }
続いてinvokeしてみます。
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{ \"jsonrpc\": \"2.0\", \"method\": \"invoke\", \"params\": { \"type\": 1, \"chaincodeID\": { \"name\": \"da35e239025eb78d7b0af31964639ac05f3869f0ad798ef7e89432f47ce63e56e31d761dc225d982f9eea3daba12a1b04a78e817ec81e389defbf126081a76e1\" }, \"ctorMsg\": { \"function\": \"invoke\", \"args\": [\"test\", \"123\"] } }, \"id\": 2 }" "192.168.2.230:7050/chaincode"
実行も良さそうです。
{ "jsonrpc": "2.0", "result": { "status": "OK", "message": "4ccb6e02-4763-4c42-81f9-b17143b5fc5e" }, "id": 2 }
最後にqueryを発行して結果を取得してみます。
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{ \"jsonrpc\": \"2.0\", \"method\": \"query\", \"params\": { \"type\": 1, \"chaincodeID\": { \"name\": \"da35e239025eb78d7b0af31964639ac05f3869f0ad798ef7e89432f47ce63e56e31d761dc225d982f9eea3daba12a1b04a78e817ec81e389defbf126081a76e1\" }, \"ctorMsg\": { \"function\": \"query\", \"args\": [\"test\"] } }, \"id\": 3 }" "192.168.2.230:7050/chaincode"
結果もバッチリ帰ってきました。
{ "jsonrpc": "2.0", "result": { "status": "OK", "message": "123" }, "id":3 }
これでhyperledgerで遊べますね。
まとめ
hyperledgerはコードベースがどんどん更新されていくので動いたり動かなかったりが ハマりポイントなのかなーと思いました。
実際にhyperledgerを触ってみると、手元環境 + PBFTということもあってEthereumを 触っていたときよりも圧倒的にサクサク感あって快適なblockchain環境です。
- 秋の夜長にBlockchain -
おわり。