自己动手部署区块链-hyperledger/fabric-02

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 编写

[[email protected] fabric]# pwd
/opt/fabric
[[email protected] fabric]# ls
docker-compose.yml  docker-compose.yml.old  INFO
[[email protected] 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"
[[email protected] 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

编译成功会在 GOPATH/srcchaincodeexample02d.chaincode GOPATH/src 下运行
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,不用下载的。

阅读更多

更多精彩内容