Hyperledger Fabric 容器部署以及chaincode测试(BYFN)

准备工作

我是在Mac笔记本上完成的一下操作,其他平台类似。在部署fabric之前需要为电脑安装一下几个软件:

Docker 可以从小鲸鱼官网下载桌面版安装,很方面启动、停止、重启docker服务。安装并启动后可在控制台使用 docker --version 命令测试是否正常。此次安装还自动添加了一个docker的工具docker-compose,这个工具在fabric的部署中会用到,同样可以使用 docker-compose --version来检查是否安装正常。

目前fabric主要支持两种语言GoNodeJS, 这两个语言的安装及配置可以参看Go programing languageNode.js

Hyperledger Fabric Samples是由官方给出的一个示例集合,包含好几个不同拓扑结构的fabric样例以及不同功能的chaincode源码,为我们学习的提供了很好的参考。获取方式

1
git clone -b master https://github.com/hyperledger/fabric-samples.git

最后一步准备工作是需要下载Fabric平台所需的binaries文件,包括cryptogen,configtxgen,configtxlator, 和peer这些工具不仅可以配合Samples使用,还可以提供很多方便强大的功能有机会在介绍,下载方式:

1
curl -sSL https://goo.gl/fMh2s3 | bash

启动Fabric网络

所有准备工作已经就绪,执行下面的文件就可以启动fabric网络:

1
2
3
cd fabric-samples/first-network
./byfn.sh -m generate
./byfn.sh -m up

此处我们使用的是第一个示例Building Your First Network(BYFN), 打开源码或者输入./byfn.sh --help就可以看到使用细节以及实现方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
./byfn.sh --help
Usage:
byfn.sh -m up|down|restart|generate [-c <channel name>] [-t <timeout>] [-d <delay>] [-f <docker-compose-file>] [-s <dbtype>]
byfn.sh -h|--help (print this message)
-m <mode> - one of 'up', 'down', 'restart' or 'generate'
- 'up' - bring up the network with docker-compose up
- 'down' - clear the network with docker-compose down
- 'restart' - restart the network
- 'generate' - generate required certificates and genesis block
-c <channel name> - channel name to use (defaults to "mychannel")
-t <timeout> - CLI timeout duration in seconds (defaults to 10000)
-d <delay> - delay duration in seconds (defaults to 3)
-f <docker-compose-file> - specify which docker-compose file use (defaults to docker-compose-cli.yaml)
-s <dbtype> - the database backend to use: goleveldb (default) or couchdb
-l <language> - the chaincode language: golang (default) or node

Typically, one would first generate the required certificates and
genesis block, then bring up the network. e.g.:

byfn.sh -m generate -c mychannel
byfn.sh -m up -c mychannel -s couchdb

fabric网络需要先generate,然后再通过传入参数up/down 来启动和终止网络。这个例子中会依据configtx.yaml设计的结构依次启动各个功能节点容器。

值得注意的是:

  1. 网络启动后会按照byfn.sh中的代码,创建通道->所有节点加入通道->更新anchor节点->部署“chaincode_example02” chaincode->验证chaincode的init/query/invoke是都可以正常执行。完成整个操作,网络默认运行10000s后关闭。我们在学习中为了方便可以通过-t 整个参数来修改运行时间。

    1
    ./byfn.sh -m up -t 999999
  2. 网络默认使用的是goleveldb,如果想使用couchdb可以通过参数-s, 用docker ps 查看可以发现会启动一个couchdb的容器,本地访问http://localhost:5984/_utils 进入web管理界面:

    1
    ./byfn.sh -m up -t 999999 -s couchdb

部署测试chaincode

部署和执行chaincode需要先进入CLI容器(docker 从fabric-tools镜像启动的container):

1
2
docker exec -it cli bash
root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#

上面提到过,因为byfn.sh脚本中已经完成了一些列设置。所以我们可以简单测试一下“chaincode_example02”这个chaincode的功能,完成转账查询等操作。已Go语言为例

1
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

查询a的余额

1
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

完成a给b转账20

1
peer chaincode invoke -o orderer.example.com:7050  --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

已经自动部署了02 可以直接测试使用。
手动部署另外一个例子中提供的chaincode,marbles02(不同版本这个例子所在的路径有可能略有不同,在部署chaincode的时候如果报错修改命令中的路径即可).

1
2
peer chaincode install -n marbles -v 1.0 -p github.com/chaincode/marbles02/go
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org0MSP.member','Org1MSP.member')"

注:各个命令的语法可以使用help查看解释,例如-P (‘Org0MSP.member’,’Org1MSP.member’)” 表明要求背书结点至少选Org0MSP0和Org0MSP1中的一个。

调用chaincode中的invoke修改数据, 与上面类似

1
2
3
4
5
6
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble1","blue","35","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble2","red","50","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble3","blue","70","tom"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarble","marble2","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarblesBasedOnColor","blue","jerry"]}'
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["delete","marble1"]}'

查询命令

1
peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["readMarble","marble2"]}'

常用docker命令

  • docker network prune #擦除环境设置,恢复干净的网络环境
  • docker ps # list running container
  • docker rm -f $(docker ps -aq) # remove container
  • docker rmi -f $(docker images -q) # remove image
  • docker logs -f cli # 查看日志
坚持原创技术分享,记录点滴成长历程!