【2020初春】【区块链】半手动搭建fabric多机部署及问题

在踩了好多坑之后,终于成功的在三台虚拟机上搭起来fabric网络

配置文件使用的是e2e_cli的基础上进行修改,但是运行还是要分步骤来,直接使用script.sh容易在出错的时候不知道哪一步出了问题,而且把环境搞的乱七八糟,修复起来连续踩坑。

在修完所有的bug之后,发现80%的问题都是环境清理遗留问题,而且即使知道是这个问题,也不好定位到底是哪里被修改了。

三台机器角色设置:

15.1.0.167 order节点
15.1.0.101 peer0.Org1
15.1.20.229 Peer0.Org2

保证三台机器本机都能运行fabric网络

修改hosts文件

vim /etc/hosts

添加

15.1.0.167 orderer.example.com
15.1.0.101 peer0.org1.example.com
15.1.20.229 peer0.org2.example.com

生成channel-artifacts;crypto-config文件夹(生成一次即可)

./generateArtifacts.sh mychannel

channel-artifacts,里面包含mychannel通道相关的文件
crypto-config,里面包含各个节点的公私钥和证书的信息
(后面挂载到镜像文件中)

设置docker-compose-order.yaml
基于自带的docker-compose.cli修改

cp docker-compose-cli.yaml docker-compose-peer.yaml

只保留order,其他删除

version: '2'

services:

  orderer.example.com:
    extends:
      file:   base/docker-compose-base.yaml
      service: orderer.example.com
    container_name: orderer.example.com

设置docker-compose-peer.yaml

peer0.org1
只保留一个peer和cli
修改:extra_hosts,(cli)depends on ; extra_hosts,去掉command一行

version: '2'

services:


  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    extends:
      file:  base/docker-compose-base.yaml
      service: peer0.org1.example.com
    extra_hosts:                          //add
      - "orderer.example.com:15.1.0.167"  //add

 cli:
    container_name: cli
    image: hyperledger/fabric-tools
    tty: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.exampl
e.com/peers/peer0.org1.example.com/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example
.com/peers/peer0.org1.example.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.ex
ample.com/peers/peer0.org1.example.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.exampl
e.com/users/Admin@org1.example.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    volumes:
        - /var/run/:/host/var/run/
        - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go
        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    depends_on:
      - peer0.org1.example.com
    extra_hosts:
      - "orderer.example.com:15.1.0.167"
      - "peer0.org1.example.com:15.1.0.101"
      - "peer0.org2.example.com:15.1.20.229"

peer0.Org2
基于peer0.Org1
修改:extra_hosts,(cli)depends on ; extra_hosts,去掉command一行
所有org1都改为org2

version: '2'

services:


  peer0.org2.example.com:
    container_name: peer0.org2.example.com
    extends:
      file:  base/docker-compose-base.yaml
      service: peer0.org2.example.com
    extra_hosts:
      - "orderer.example.com:15.1.0.167"

 cli:
    container_name: cli
    image: hyperledger/fabric-tools
    tty: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
      - CORE_PEER_LOCALMSPID=Org2MSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.exampl
e.com/peers/peer0.org2.example.com/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example
.com/peers/peer0.org2.example.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.ex
ample.com/peers/peer0.org2.example.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.exampl
e.com/users/Admin@org2.example.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    volumes:
        - /var/run/:/host/var/run/
        - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go
        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    depends_on:
      - peer0.org2.example.com
    extra_hosts:
      - "orderer.example.com:15.1.0.167"
      - "peer0.org1.example.com:15.1.0.101"
      - "peer0.org2.example.com:15.1.20.229"

修改base/docker-compose-base.yaml
此文件主要进行网络设置
去掉不存在的节点,由于不在同一个机子上,所以不需要端口映射

ports: 
  - 7051:7051 
  - 7052:7052 
  - 7053:7053

以上在order中修改,其他两个主机的e2e_cli直接替换
替换后org1 org2的docker-compose-peer.yaml按上面对应修改

启动容器

在order节点上

docker-compose -f docker-compose-orderer.yaml up -d 

在两个peer节点上

docker-compose -f docker-compose-peer.yaml up -d

都启动完成时docker ps -a 查看容器,可以看到 order节点上一个order容器,peer上分别两个,peer和cli容器

Org1节点操作

容器启动成功后在peer节点上操作
进入cli容器(不关闭容器退出 Ctrl + P + Q,关闭容器退出 exit)

docker exec -it cli bash

设置变量,方便后面使用(要设置,不然后面的语句找不到参数,不设置太长没办法输)

CHANNEL_NAME=mychannel
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

第一个peer节点:
创建通道(同一个通道只需要创建一次)

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA

加入通道

peer channel join -b mychannel.block

更新为锚节点(本次每个组织只有一个节点,所以可以选择性设置)

peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $ORDERER_CA

安装链码(代码地址与映射的地址相关)

peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

实例化链码(只需实例化一次)

peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}'

测试是否成功:
query查询(此时100)

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

invoke交互(交互完a减少10)

peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

再次query,变为90,成功

Org2节点操作

获取通道文件(Org1创建的通道)

peer channel fetch oldest mychannel.block -o orderer.example.com:7050 -c mychannel --tls --cafile $ORDERER_CA

加入通道

peer channel join -b mychannel.block

安装链码

peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

测试:
query查询,结果是Org1 invoke操作后的90,说明成功

遇到的问题

  1. 修改配置文件的时候,注意细节,自己配置时落下depend on,导致容器启动说找不到peer1.org1
  2. 开启配置用到的端口,默认状态下没开,导致后面加入网络的时候提示404之类的,报错很明显说网络不通(ping可以通,但是端口没开看不出来)
firewall-cmd --zone=public --add-port=7051/tcp --permanent //开启7051端口
firewall-cmd --reload //立即生效
firewall-cmd --zone=public --list-ports // 查看已经开放的端口
  1. 配置网络出现问题需要重做的时候,环境一定要清理干净,不然会有很多奇奇怪怪的错误
    一开始找不到关闭网络的办法,其实开启是 .yaml up ,关闭就.yaml down 就行了
    这一句很好用,底下的作为补充
docker-compose -f docker-compose-peer.yaml down --volumes --remove-orphans 
sudo docker rm -f $(docker ps -a | grep "hyperledger/*" | awk "{print \$1}")
sudo  docker volume prune
  1. ※ 关于 Cannot run peer because cannot init crypto, missing /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp folder 错误

最开始就是因为出现了这个错误,导致连环错。网上关于这个问题的回答是 环境没有清理干净,重启docker/重启网络,但是这些方法并没有用,反而把环境弄的更乱(猜测文件就是因为这个丢失的)

错误提示是在这个路径下找不到东西,在xftp里面按这个路径根本就没有这些文件夹,就卡在了这里
实际上是因为,这个路径是虚拟路径,没办法直接进行文件操作
这就与前面的docker-compose-peer.yaml里的cli地方的配置有关,volumes其实是对文件进行挂载,后面的虚拟路径下的文件是通过:前的文件对应加载过来的,所以前面说crypto里面找不到文件,就在xftp中更新正确的crypto文件夹即可(第一步生成的,其他机子上也有,保持一致即可)

 volumes:
        - /var/run/:/host/var/run/
        - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go
        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts

语法示意

/var/run  --系统路径
/host/var/run/  --docker容器内部路径
./  --当前目录
../  --父级目录

正常crypto里面有peer,msp,ca 等等,发生错误的时候crypto里只有一个peer,所以无法运行

参考:
深蓝居Fabric 1.0的多机部署
搭建fabric多机部署环境
联盟链 Hyperledger Fabric v1.4.4 四台分机搭建1orderer+3peer
手动部署hyperledger fabric单机多节点网络
搭建基于hyperledger fabric的联盟社区(五) --启动Fabric网络

踩了很多坑,中间也有心态爆炸的时候,改bug真的很考验细心和耐心,

你可能感兴趣的:(2020初春,区块链)