Michael.W谈hyperledger Fabric第10期-手动搭建Fabric网络之启动网络与功能调试一
Michael.W谈hyperledger Fabric第10期-手动搭建Fabric网络之启动网络与功能调试一
1 网络内容器启动顺序
前面已经详细地讲解了编写管理1个orderer节点容器、4个peer节点容器(组织org1中2个,组织org2中2个)和1个客户端容器的docker-compose的配置文件。先看一下各个容器的启动顺序:
上图为docker-compose-cli.yaml文件中cli(客户端)容器的依赖项,所以可知我搭建的网络内容器启动顺序为:
- orderer节点
- 组织1中的peer0节点
- 组织1中的peer1节点
- 组织2中的peer0节点
- 组织2中的peer1节点
- 客户端节点
启动各个容器后,我还需要做什么操作?
- 利用客户端连接到一个peer节点并创建通道;(网络内通道只需要创建一次)
- 将网络内所有peer节点(4个)都加入该通道中;
- 给所有的peer节点都安装链码;
- 在任意一个peer节点上初始化链码;(网络内链码只需要初始化一次)
- 分别在各个peer节点上进行交易查询(读操作),验证以上操作结果正确;
- 在任一peer节点发起一次交易(写操作),验证结果。
2 启动网络
事先强调一点:你在网络内对各个节点执行的所有操作都是借助于客户端通过指令来完成的!
首先进入到顶级工程路径下,通过docker-compose指令启动网络内的所有容器
$ cd ~/test
此时,我的Fabric网络工程文件组织结构如下:
其中每个文件的编写和生成,在之前的帖子中均有详细讲解。有疑问的小伙伴可以去前面的帖子看一下:
- crypto-config.yaml和crypto-config目录:
《Michael.W谈hyperledger Fabric第4期-手动搭建Fabric网络之Fabric证书的生成》 - configtx.yaml:
《Michael.W谈hyperledger Fabric第5期-手动搭建Fabric网络之创世块/通道的生成一》 - genesis.block、channel.tx、org1Anchor.tx和org2Anchor.tx:
《Michael.W谈hyperledger Fabric第6期-手动搭建Fabric网络之创世块/通道的生成二》 - docker-compose-cli.yaml、docker-compose-base.yaml和peer-base.yaml:
《Michael.W谈hyperledger Fabric第7期-手动搭建Fabric网络之编写用于启动网络的docker-compose配置文件-客户端》
《Michael.W谈hyperledger Fabric第8期-手动搭建Fabric网络之编写用于启动网络的docker-compose配置文件-orderer节点》
《Michael.W谈hyperledger Fabric第9期-手动搭建Fabric网络之编写用于启动网络的docker-compose配置文件-peer节点》 - chaincode_example02.go:是从原Fabric测试网络工程下拷贝过来的链码,用来测试。
$ mkdir ~/test/chaincode $ cp ~/hyperledger-fabric/fabric-samples/chaincode/chaincode_example02/go/chaincode_example02.go ~/test/chaincode
启动网络:
# 以docker-compose-cli.yaml为配置文件启动
$ docker-compose -f docker-compose-cli.yaml up -d
# 参数-d表示以守护进程的形式启动,在后台运行
如果你的三个yaml文件配置没有问题的话,打印信息应该如上图所示。
3 创建通道
在宿主机的终端中,进入客户端:
$ docker exec -it cli bash
由于我在docker-compose-cli.yaml中设置了客户端自动连接org1的peer0节点,所以现在通过客户端的所有操作都是对org1的peer0节点的操作。在cli中创建通道:
# 设置环境变量,即orderer节点的tlsca证书地址
$ tlsfile=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/michael.com/orderers/orderer.michael.com/msp/tlscacerts/tlsca.michael.com-cert.pem
# 创建通道
$ peer channel create -o orderer.michael.com:7050 --tls true --cafile $tlsfile -c michaelchannel -f ./channel-artifacts/channel.tx
# -o:orderer节点的地址+端口号
# --tls:通信是否采用tls加密。参数后面什么都不写,默认为true
# --cafile:orderer节点的ca证书文件路径
# -c:通道名字。前面创建生成通道依赖文件channel.tx时曾指定过通道名字,此处需要与之保持一致
# -f:生成通道的依赖文件channel.tx的文件路径
如果创建通道成功后,在当前容器目录下可以看见一个新生成的文件:michaelchannel.block——该文件就是创建出的通道。
强调:创建通道只需要创建一次!
下面有几种错误信息:
- “Error: got unexpected status: BAD_REQUEST – error authorizing
update: error validating ReadSet: readset expected key [Group]
/Channel/Application at version 0, but got version 1”
原因:之前已经创建过通道,又一次创建。即使把创建出的通道文件删了也会出这个错误。
解决方法:Ctrl+D 退出容器 # 关闭并删除所有容器 $ docker-compose -f docker-compose-cli.yaml down # 删除没有被删除数据卷 $ docker volume prune # 之后从头开始启动网络即可
- “error validating DeltaSet: policy for [Group] /Channel/Application not satisfied: Failed to reach implicit threshold of 1 sub-policies, required 1 remaining”
原因:configtx.yaml在生成通道文件的时候指定了错误的msp路径。
解决方法:修改configtx.yaml文件,重新生成创世区块和同道依赖文件。然后将所有容器和数据卷清理后(参照上面问题的解决方法),重新开始。
ps:关闭并删除所有由某docker-compose配置文件管理的在运行的容器
$ docker-compose -f docker-compose-cli.yaml down
# 关闭并删除的是所有由docker-compose-cli.yaml管理的docker容器
4 peer节点加入通道
$ peer channel join -b michaelchannel.block
# -b:之前生成的通道文件
验证一下当前通道的加入情况:
$ peer channel list
可见当前节点已经加入到通道中。
5 链码的安装
所有的节点都必须依次安装链码。所安装的链码就是chaincode目录下的chaincode_example02.go文件。链码的安装有两种方法:
5.1 直接安装
$ peer chaincode install -n michaelchaincode -v 1.0 -p github.com/chaincode
# -n:安装后的链码名,自定义。
# -v:安装的链码版本,自定义。
# -p:链码文件的路径。注意:该路径必须是相对于容器内$GOPATH/src的相对路径。填绝对路径是不可以的。切记!
# -l:链码的编写语言。默认为go语言,node.js要填node,java要填java。
当出现payload:"OK"时,表明链码安装成功。
5.2 打包安装(推荐)
一般在多机多节点部署的时候推荐这种安装方式。因为在不同的机器上,采用直接安装可能会出现哈希值不匹配的报错。
# 打包链码
$ peer chaincode package -n michaelchaincode -v 1.0 -p github.com/chaincode mychaincode.package
# -n:安装后的链码名,自定义。
# -v:安装的链码版本,自定义。
# -p:链码文件的路径。注意:该路径必须是相对于容器内$GOPATH/src的相对路径。填绝对路径是不可以的。切记!
# -l:链码的编写语言。默认为go语言,node.js要填node,java要填java。
# mychaincode.package是打包后的链码
# 通过打包后的链码安装
$ peer chaincode install mychaincode.package
打包成功后,在当前目录下可见打包的链码文件mychaincode.package。
安装后看到payload:"OK"时,表明链码安装成功。
6 通过客户端切换节点
现在已经在org1的peer0节点上完成了加入创建通道、加入通道和安装链码的操作。但是如何在其他三个peer节点上也完成对应的操作呢?请注意我在docker-compose-cli.yaml文件中对cli的配置:
只要将客户端内这些环境变量对应改成要操作的peer节点的环境变量值时,客户端就相当于切换了节点!
具体环境变量的含义前面已经详细讲过,这里不再赘述。我将剩下三个节点加入通道、通过打包链码来安装链码的命令按顺序罗列如下:
# 切换到组织1的peer1节点
$ CORE_PEER_ADDRESS=peer1.org1.michael.com:7051
$ CORE_PEER_LOCALMSPID=Org1MSP
$ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.michael.com/users/[email protected]/msp
$ CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.michael.com/peers/peer1.org1.michael.com/tls/ca.crt
$ CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.michael.com/peers/peer1.org1.michael.com/tls/server.crt
$ CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.michael.com/peers/peer1.org1.michael.com/tls/server.key
# 加入通道
$ peer channel join -b michaelchannel.block
# 通过链码包安装链码。因为所有的容器都与宿主机产生映射,所有在peer0中生成的链码包在所有的容器中均可见。
$ peer chaincode install mychaincode.package
# 切换到组织2的peer0节点
$ CORE_PEER_ADDRESS=peer0.org2.michael.com:7051
$ CORE_PEER_LOCALMSPID=Org2MSP
$ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.michael.com/users/[email protected]/msp
$ CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.michael.com/peers/peer0.org2.michael.com/tls/ca.crt
$ CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.michael.com/peers/peer0.org2.michael.com/tls/server.crt
$ CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.michael.com/peers/peer0.org2.michael.com/tls/server.key
$ peer channel join -b michaelchannel.block
$ peer chaincode install mychaincode.package
# 切换到组织2的peer1节点
$ CORE_PEER_ADDRESS=peer1.org2.michael.com:7051
$ CORE_PEER_LOCALMSPID=Org2MSP
$ CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.michael.com/users/[email protected]/msp
$ CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.michael.com/peers/peer1.org2.michael.com/tls/ca.crt
$ CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.michael.com/peers/peer1.org2.michael.com/tls/server.crt
$ CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.michael.com/peers/peer1.org2.michael.com/tls/server.key
$ peer channel join -b michaelchannel.block
$ peer chaincode install mychaincode.package
至此,四个peer节点都加入到了通道michaelchannel中,并且安装上了相同的链码。
ps:
本人热爱图灵,热爱中本聪,热爱V神,热爱一切被梨花照过的姑娘。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!
如果需要转发,麻烦注明作者。十分感谢!
公众号名称:后现代泼痞浪漫主义奠基人