読者です 読者をやめる 読者になる 読者になる

しまてく

学んだ技術を書きためるブログ

dockerでhyperledger/fabricをセットアップ & Chaincode実行まで。

使ってみた Blockchain hyperledger

hyperledger/fabricを使ってchaincodeで遊ぶ

最近良く耳にするhyperledgerを手元の環境(docker)で試したくて セットアップをしたのですがややハマったので記録に残します。 このエントリが誰かの役に少しでも立てば幸いです。

docker-composeのセットアップ

dockerの元イメージとしては以下を利用しました。

https://hub.docker.com/r/yeasy/hyperledger-peer/

最終的なdocker-compose.ymlは以下にあります。

github.com

上記のdocker-compose.ymlとcommon.ymlを配置したディレクトリで

docker-compose up -d

として起動します。

起動はこれだけです。カンタンですね!

chaincodeの登録

次にchaincodeを登録するのですが、 登録するchaincodeは以下のリポジトリのサンプルをお借りしました。

github.com

ただし上記のままだとインターフェースが合わないと怒られるので、 最新のインターフェースに併せて以下のように変更しています。

github.com

これを実際に登録します。

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 -

おわり。