ビットコインとブロックチェーン:暗号通貨を支える技術といった本を読んだりだとか身辺でビットコインの話題が出るに連れ、個人的にはブロックチェーンに興味があるのでそのあたりの環境を作るのに手軽な基盤はないかなと見ていたところHyperledgerというプロジェクトを知った。
Hyperledger自体はLinux Foundationが進めているブロックチェーン技術に関するオープンソースコミュニティーで、そこで開発されているブロックチェーンの基盤にHyperledger Fabric*1があり、他にも複数のプロジェクトが推進されている。(詳しくはこちらのページが詳しい)

f:id:hideack:20170320171631p:plain:w350

Home | Hyper Ledger Foundation Home | Hyper Ledger Foundation

Fabric自体はDockerHubにイメージが提供されているので、これを使うとローカルにもFabricによるブロックチェーン基盤を立てることができるということなので試してみた。
まずはイメージをpullする。

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

fabric-membersrvcが証明書等のCAとなるコンポーネントのコンテナ、fabric-peerがブロックチェーン内でのpeerのコンテナに該当する。
membersrvcと少なくとも1つpeerを立ち上げる必要があるので、pullが完了したら以下の様なdocker-compose用のYAMLを用意する。

membersrvc:
image: hyperledger/fabric-membersrvc
command: membersrvc
vp0:
image: hyperledger/fabric-peer
ports:
- "7050:7050"
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 fabric_membersrvc_1
Starting fabric_vp0_1
Attaching to fabric_membersrvc_1, fabric_vp0_1
vp0_1         | 07:33:18.451 [logging] LoggingInit -> DEBU 001 Setting default logging level to DEBUG for command 'node'
vp0_1         | 07:33:18.451 [nodeCmd] serve -> INFO 002 Running in chaincode development mode
vp0_1         | 07:33:18.451 [nodeCmd] serve -> INFO 003 Set consensus to NOOPS and user starts chaincode
vp0_1         | 07:33:18.451 [nodeCmd] serve -> INFO 004 Disable loading validity system chaincode
vp0_1         | 07:33:18.452 [peer] func1 -> INFO 005 Auto detected peer address: 172.17.0.3:7051
vp0_1         | 07:33:18.454 [peer] func1 -> INFO 006 Auto detected peer address: 172.17.0.3:7051
(snip)

何やら動き始めた感があるので、サンプルユーザーとしてJimというユーザーが登録されているのでAPIを叩いてみる。

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

また、ブロックチェーン自体も素朴に http://localhost:7050/chain を開くと確認できる。

HTTP/1.1 200 OK
Access-Control-Allow-Headers: accept, content-type
Access-Control-Allow-Origin: *
Content-Length: 123
Content-Type: application/json
Date: Mon, 20 Mar 2017 07:55:16 GMT
{
"currentBlockHash": "RrndKwuojRMjOz/rdD7rJD/NUupiuBuCtQwnZG7Vdi/XXcTd2MDyAMsFAZ1ntZL2/IIcSUeatIZAKS6ss7fEvg==",
"height": 1
}

こういった形で何やら動き始めるところまでは確認できたので実際に諸々試すのはまた次回。

備考

この本で大雑把に技術周りも含めて把握したつもりなのだけれども、なんらか手を動かさないとどうもピンとこない性分なので試してみている。

ビットコインとブロックチェーン:暗号通貨を支える技術

*1:Pythonのツールと名前が被りますね…