1、环境架构说明:
系统采用容器的方式运行,构建过程简单、各组件分工清晰:
1.Docker-compose:Docker 容器管理;
2.Go lang SDK:Go 语言开发、编译环境;
3.Git:git 镜像克隆与提交;
4.Rest Client: rest API 测试;
容器主要运行有:MemberSrv 和Peer;
2.部署环境准备
3.安装与部署
3.1从 DockerHub上拉取镜像
a. 安装和部署Docker以及docker-compose,详细过程见《使用docker compose部署服务》。
b.拉取镜像
[root@docker fabric]#docker pull hyperledger/fabric-peer:latest #拉取peer的镜像
[root@docker fabric]#docker pull hyperledger/fabric-membersrvc:latest#拉取memberserver的镜像
[root@docker fabric]# docker images#确认镜像拉取成功
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 19146d5729dc 2 days ago 181.6 MB
docker.io/hyperledger/fabric-membersrvc latest b3654d32e4f9 9 weeks ago 1.417 GB
docker.io/hyperledger/fabric-peer latest 21cb00fb27f4 9 weeks ago 1.423 GB
3.2 Docker-compose.yml 编写
[root@docker fabric]# pwd
/opt/fabric
[root@docker fabric]# ls
docker-compose.yml docker-compose.yml.old INFO
[root@docker fabric]# more docker-compose.yml
membersrvc:
image: hyperledger/fabric-membersrvc
ports:
- "7054:7054" command: membersrvc
vp0:
image: hyperledger/fabric-peer
ports:
- "7050:7050" - "7051:7051" - "7053:7053" environment:
- CORE_PEER_ADDRESSAUTODETECT=true - CORE_VM_ENDPOINT=unix:///var/run/docker.sock - 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 volumes:
- /var/run/:/var/run/ links:
- membersrvc command: sh -c "sleep 5; peer node start --peer-chaincodedev"
[root@docker fabric]#
3.3 启动
保存 docker-compose.yml 到/opt/fabric目录,运行docker-compose up 命令启动2个容器(MemberServer和Peer).
到此,我们可以具备启动和运行chaincode,并进行权限管理的Fabric(虽然只有一个Peer):
[root@docker fabric]# docker-compose up
Creating fabric_membersrvc_1
Creating fabric_vp0_1
Attaching to fabric_membersrvc_1, fabric_vp0_1
直到启动日志显示如下内容,说明启动成功:
运行docker-compose ps 可以看到服务和对应的端口映射:
另外,常用操作:
[root@docker fabric]# docker-compose logs -f vp0#查看日志
[root@docker fabric]# docker-compose exec vp0 bash#exec到vp0
3.4运行与发布Chaincode
a.进入到peer里 $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go 目录下:
[root@docker fabric]# docker-compose exec vp0 bash
我们发现这个目录里有很多用例chaincode程序(基于go语言编写),我们选择chaincode_example2进行部署与测试。
b.部署chaincode_example。
拷贝chaincode_example02 到$GOPATH/src
root@e33e7f4dceb3:/opt/gopath/src# cp $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02.go $GOPATH/src/
c.在$GOPATH/src中进行编译
root@e33e7f4dceb3:/opt/gopath/src# go build ./chaincode_example02.go
root@e33e7f4dceb3:/opt/gopath/src# ls
chaincode_example02 chaincode_example02.go github.com
编译成功会在
CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02
直至出现“Received REGISTERED”字样,代表成功。
3.5 deploy,invoke与query chaincode
a.login
CLI方式:
peer network login #用户名和密码在 membersrvc.yaml 文件里
Rest 方式:
b.deploy
CLI 方式
CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode deploy -u jim -n mycc -c '{"Args": ["init", "a","100", "b", "200"]}'
Rest 方式:
c.Invoke
CLI 方式
CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode invoke -u jim -l golang -n mycc -c '{"Args": ["invoke", "a", "b", "10"]}'
a 向b 转10块钱后,可以看到a 变成90,b变成210
Aval = 90, Bval = 210
Rest 方式:
d. query
CLI方式:
peer chaincode query -l golang -n mycc -c '{"Args": ["query", "b"]}' -u jim
Rest 方式:
查询到b 得到了10块钱,查a 的话,会得到-10.
总结:
1.上述过程演示了Fabric的搭建过程;
2.演示了chaincode的部署、共识执行和查询;
3.演示了通过CLI和Rest api 方式与peer进行交互;
提示:chaincode chaincode_example02.go 用例程序社区上下载(https://raw.githubusercontent.com/hyperledger/fabric/master/examples/chaincode/go/chaincode_example02/chaincode_example02.go)的有问题,编译不能通过,query时会超时:
vp0_1 | 07:49:12.906 [rest] processChaincodeInvokeOrQuery -> ERRO af8 Error when querying chaincode: Error:Failed to execute transaction or query(Timeout expired while executing transaction)
peer 里会出现:
14:57:01.368 [shim] DEBU : [ca1a01d3]Handling ChaincodeMessage of type: RANGE_QUERY_STATE(state:ready) Error starting Simple chaincode: Error handling message: [ca1a01d3-33e8-4fc2-be69-5ff8064f9b1a]Chaincode handler FSM cannot handle message (RANGE_QUERY_STATE) with payload size (10) while in state: ready
解决办法:
采用$GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02,不用下载的。