前面已经详细地讲解了编写管理1个orderer节点容器、4个peer节点容器(组织org1中2个,组织org2中2个)和1个客户端容器的docker-compose的配置文件。先看一下各个容器的启动顺序:
上图为docker-compose-cli.yaml文件中cli(客户端)容器的依赖项,所以可知我搭建的网络内容器启动顺序为:
启动各个容器后,我还需要做什么操作?
事先强调一点:你在网络内对各个节点执行的所有操作都是借助于客户端通过指令来完成的!
首先进入到顶级工程路径下,通过docker-compose指令启动网络内的所有容器
$ cd ~/test
此时,我的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文件配置没有问题的话,打印信息应该如上图所示。
在宿主机的终端中,进入客户端:
$ 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——该文件就是创建出的通道。
强调:创建通道只需要创建一次!
下面有几种错误信息:
Ctrl+D 退出容器
# 关闭并删除所有容器
$ docker-compose -f docker-compose-cli.yaml down
# 删除没有被删除数据卷
$ docker volume prune
# 之后从头开始启动网络即可
ps:关闭并删除所有由某docker-compose配置文件管理的在运行的容器
$ docker-compose -f docker-compose-cli.yaml down
# 关闭并删除的是所有由docker-compose-cli.yaml管理的docker容器
$ peer channel join -b michaelchannel.block
# -b:之前生成的通道文件
$ peer channel list
所有的节点都必须依次安装链码。所安装的链码就是chaincode目录下的chaincode_example02.go文件。链码的安装有两种方法:
$ peer chaincode install -n michaelchaincode -v 1.0 -p github.com/chaincode
# -n:安装后的链码名,自定义。
# -v:安装的链码版本,自定义。
# -p:链码文件的路径。注意:该路径必须是相对于容器内$GOPATH/src的相对路径。填绝对路径是不可以的。切记!
# -l:链码的编写语言。默认为go语言,node.js要填node,java要填java。
一般在多机多节点部署的时候推荐这种安装方式。因为在不同的机器上,采用直接安装可能会出现哈希值不匹配的报错。
# 打包链码
$ 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"时,表明链码安装成功。
现在已经在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神,热爱一切被梨花照过的姑娘。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!
如果需要转发,麻烦注明作者。十分感谢!
公众号名称:后现代泼痞浪漫主义奠基人