fabric1.4.1raft网络搭建

基于Raft共识算法搭建多机Fabric1.4.1网络

在fabric1.4.1的版本中,提供了基于raft共识的raft排序服务。raft的模型可以容忍奔溃,如果有节点故障掉线可以正常运行。前提是要有大多数存活,也就是要保证1/2以上的节点个数正常运行。raft共识是“主从模型”,主节点通过动态选举决定,从节点是主节点的复制。raft排序服务比kafka排序服务易于设置和管理。并且raft的设计允许不同的组织贡献节点来共同组成排序服务。raft排序是fabric实现拜占庭容错排序服务的第⼀步,如我们所见,开发raft排序服务的决定也是基于此的。raft节点之间通过使⽤用TLS认证身份,如果一个攻击者想要伪造raft节点,就必须要获得⼀个有效的证书和对应的私钥。所以,没有⼀个有效的TLS证书,是不可能运行raft节点的。 要使用raft共识,需要修改两个地⽅:
1. 本地配置:⽤用来控制节点的特性,例例如TLS配置,备份个数和⽂文件存储。
2. 通道配置:⽤用来定义raft集群的成员关系,以及raft协议相关的参数,例例如⼼心跳间隔、leader节点超时时间等。
3. 需要注意的是,每个channel有属于它⾃己的raft集群。因此,在chennel中要指定raft节点,指定的方式是把raft节点的tls证书配置到channel的配置文件中。在系统通道和应用通道中的配置中,每个排序以consenter的形式列出来。下⾯有configtx.yaml中关于raft节点的配置。
4. 必须开启TLS才能使用Raft排序

上文中已经把搭建fabric网络所需要的环境部署工作已经完成。

1、搭建基于Raft共识的多机fabric网络环境的说明与准备

在本次基于Raft共识搭建的fabric1.4.1网络环境中,准备搭建五个orderer节点、一个组织四个peer,未加入CouchDB和fabric-ca.这里要说明一下,raft共识中同步的节点必须为奇数,因为在整个共识环境中每个节点都是follower,当他们感受到网络中没有leader节点向他们发送heartbeat的时候,他们就会变成candidater,这时候需要他们之间相互投票才能将自己由candidater变成leader,达成一致的过程需要整个网络中有n/2+1个节点达成一致,整个网络才会达成一致,所以需要奇数个同步节点,在leader选举出来之后通过leader与客户端交互,将本地的log同步到各个follower,点击这里了解更多的raft算法,。

​ 本文一共用到四台华为云主机,每台主机均是ubuntu18.04.2系统,各个主机的IP以及节点分配情况见下表:

​ 下表中是各个节点分配情况以及对应的主机IP

各个主机的节点分配情况对应主机的IP地址
orderer0.example.com,peer0.org1.example.com ,cli192.168.1.16
orderer1.example.com,peer1.org1.example.com,cli192.168.1.17
orderer2.example.com,peer2.org1.example.com,cli192.168.1.173
orderer3.example.com,orderer4.example.com,peer3.org1.example.com,cli192.168.1.190

2、基于Raft共识搭建多机fabric网络

这一节是对每台华为云主机的各个节点进行网络配置,主要涉及的是配置文件。

  • 因为在四台主机的项目目录必须一样,所有在四台主机的家目录下执行相同的命令mkdir lpgsy来创建项目目录,并进入项目目录。
第一台主机 192.168.1.16
  • 在项目目录中执行命令vim crypto-config.yaml,并将下列代码块中的内容粘贴到文件中(192.168.1.16),生成yaml文件。

     OrdererOrgs:		            # 排序节点的组织定义
       - Name: Orderer	        	# orderer节点的名称
         Domain: example.com	    # orderer节点的根域名
         Specs:			            # orderer节点的主机名
           - Hostname: orderer0
           - Hostname: orderer1
           - Hostname: orderer2
           - Hostname: orderer3
           - Hostname: orderer4
     PeerOrgs:			            # peer节点的组织定义
       - Name: Org1		            # 组织1的名称
         Domain: org1.example.com	# 组织1的根域名
         EnableNodeOUs: true	    # 是否显示节点的详细信息
         Template:
           Count: 4	    	        # 组织1中的节点(peer)数目
         Users:
           Count: 4		            # 组织1中的用户数目
    
  • 执行命令cryptogen generate --config ./crypto-config.yaml生成各个节点的证书(192.168.1.16)。

  • 执行命令vim configtx.yaml,并将下列代码块中的内容粘贴到文件中(192.168.1.16)。

     ---
     Organizations:
         - &OrdererOrg			# orderer节点配置信息
             Name: OrdererOrg		# orderer节点名称
             ID: OrdererMSP		# orderer节点ID
             MSPDir: crypto-config/ordererOrganizations/example.com/msp	# msp文件路径
             Policies:
               Readers:
                   Type: Signature
                   Rule: "OR('OrdererMSP.member')"
               Writers:
                   Type: Signature
                   Rule: "OR('OrdererMSP.member')"
               Admins:
                   Type: Signature
                   Rule: "OR('OrdererMSP.admin')"
         - &Org1			# 组织
             Name: Org1MSP		# 组织名称
             ID: Org1MSP			# 组织ID
             MSPDir: crypto-config/peerOrganizations/org1.example.com/msp	# 组织msp文件路径
             AnchorPeers:			# 访问组织的域名和端口
                 - Host: peer0.org1.example.com
                   Port: 7051
             Policies:
               Readers:
                   Type: Signature
                   Rule: "OR('Org1MSP.admin','Org1MSP.peer','Org1MSP.client')"
               Writers:
                   Type: Signature
                   Rule: "OR('Org1MSP.admin','Org1MSP.client')"
               Admins:
                   Type: Signature
                   Rule: "OR('Org1MSP.admin')"
     Capabilities:
         Channel: &ChannelCapabilities
             V1_3: true
         Orderer: &OrdererCapabilities
             V1_1: true
         Application: &ApplicationCapabilities
             V1_3: true
             V1_2: false
             V1_1: false
     Application: &ApplicationDefaults
         Organizations:
         Policies:
             Readers:
                 Type: ImplicitMeta
                 Rule: "ANY Readers"
             Writers:
                 Type: ImplicitMeta
                 Rule: "ANY Writers"
             Admins:
                 Type: ImplicitMeta
                 Rule: "MAJORITY Admins"
         Capabilities:
             <<: *ApplicationCapabilities
     Orderer: &OrdererDefaults
         OrdererType: solo
         Addresses:
             - orderer0.example.com:7050
         BatchTimeout: 2s
         BatchSize:
             MaxMessageCount: 200
             AbsoluteMaxBytes: 2 MB
             PreferredMaxBytes: 512 KB
         Kafka:
             Brokers:
             - 127.0.0.1:9092
         Organizations:
         Policies:
             Readers:
                 Type: ImplicitMeta
                 Rule: "ANY Readers"
             Writers:
                 Type: ImplicitMeta
                 Rule: "ANY Writers"
             Admins:
                 Type: ImplicitMeta
                 Rule: "MAJORITY Admins"
             BlockValidation:
                 Type: ImplicitMeta
                 Rule: "ANY Writers"
     Channel: &ChannelDefaults
         Policies:
             Readers:
                 Type: ImplicitMeta
                 Rule: "ANY Readers"
             Writers:
                 Type: ImplicitMeta
                 Rule: "ANY Writers"
             Admins:
                 Type: ImplicitMeta
                 Rule: "MAJORITY Admins"
         Capabilities:
             <<: *ChannelCapabilities
     Profiles:                                                              # 定义系统通道和应用通道配置信息,从Profiles获取-profile后边的参数
         TwoOrgsOrdererGenesis:			#组织定义标识符,可自定义               # 系统通道配置标识符,自定义
             <<: *ChannelDefaults			# 引用上面 ChannelDefaults 的属性   # 具体通道相关配置信息引用ChannelDefaults
             Capabilities:
                 <<: *ChannelCapabilities		# 引用 ChannelCapabilities 的属性
             Orderer:				# 配置属性,系统关键字,不能修改     # 系统通道配置信息
                 <<: *OrdererDefaults			# 引用上面 OrdererDefaults 的属性    # 具体配置信息引用OrdererDefaults
                 OrdererType: etcdraft			#指定排序共识
                 EtcdRaft:
                     Consenters:
                     - Host: orderer0.example.com
                       Port: 7050
                       ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/server.crt
                       ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/server.crt
                     - Host: orderer1.example.com
                       Port: 7050
                       ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/tls/server.crt
                       ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/tls/server.crt
                     - Host: orderer2.example.com
                       Port: 7050
                       ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt
                       ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt
                     - Host: orderer3.example.com
                       Port: 7050
                       ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt
                       ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt
                     - Host: orderer4.example.com
                       Port: 8050
                       ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt
                       ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt
                 Addresses:
                     - orderer0.example.com:7050
                     - orderer1.example.com:7050
                     - orderer2.example.com:7050
                     - orderer3.example.com:7050
                     - orderer4.example.com:8050
                 Organizations:                              # 系统通道组织
                 - *OrdererOrg		# 引用上面为 OrdererOrg 的属性   # 具体配置信息引用OrdererOrg
                 Capabilities:                                                                                     # 定义系统通道全局功能特性
                     <<: *OrdererCapabilities	#引用上面为 OrdererCapabilities 的属性        # 具体通道排序配置信息引用OrdererCapabilities
             Application:                                       # 系统通道信息
                 <<: *ApplicationDefaults               # 具体应用通道配置信息引用ApplicationDefaults
                 Organizations:                              # 系统通道组织
                 - <<: *OrdererOrg                         # 具体配置信息引用OrdererOrg
             Consortiums:			# 定义了系统中包含的组织                           # 联盟列表
                 SampleConsortium:                       # 联盟名称
                     Organizations:		# 系统中包含的组织                                    # 联盟的组织列表
                         - *Org1			# 引用了上面的配置
         TwoOrgsChannel:                                 # 应用通道配置标识符,自定义
             Consortium: SampleConsortium        # 应用通道关联的联盟名称
             <<: *ChannelDefaults                      # 具体通道相关配置信息引用ChannelDefaults
             Application:                                     # 应用通道信息
                 <<: *ApplicationDefaults             # 具体应用通道配置信息引用ApplicationDefaults
                 Organizations:                             # 联盟的组织列表
                     - *Org1
                 Capabilities:                               # 定义应用通道全局功能特性
                     <<: *ApplicationCapabilities    # 具体应用通道配置信息引用ApplicationCapabilities
    
  • 执行命令mkdir channel-artifacts创建文件夹,用来保存通过yaml文件以及系统通道生成的创世块文件(192.168.1.16)。

  • 执行命令configtxgen -profile TwoOrgsOrdererGenesis -channelID systemchannel -outputBlock ./channel-artifacts/genesis.block生成系统文件的创世块192.168.1.16)。

  • 执行命令configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID
    testchannel生成用于创建应用通道的通道文件(192.168.1.16)。

  • 接着将整个项目目录lpgsy中的文件拷贝到其他的三台主机上,在其他三台主机的项目目录下执行命令
    scp -r gsy@192.168.1.16:$HOME/lpgsy/channel-artifacts ./

    scp -r gsy@192.168.1.16:$HOME/lpgsy/crypto-config ./

  • 执行命令vim docker-compose-orderer.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.16)。

     version: '2'
     volumes:
       orderer0.example.com:
     services:
       orderer0.example.com:
         container_name: orderer0.example.com
         image: hyperledger/fabric-orderer:latest
         environment:
           - GODEBUG=netdns=go
           - FABRIC_LOGGING_SPEC=INFO
           - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0	# orderer服务器监听的地址
           - ORDERER_GENERAL_GENESISMETHOD=file	# 初始化块(Genesis)的来源方式
           - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block	# 存储初始块文件的路径
           - ORDERER_GENERAL_LOCALMSPID=OrdererMSP	# orderer节点的ID,在configtx.yaml模块配置文件中指定的
           - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp	 # orderer节点msp文件路径
           - ORDERER_GENERAL_TLS_ENABLED=true		# 是否启用TLS, true/false
           - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key		# orderer节点的私钥文件
           - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt		# 证书文件
           - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]		# 根证书文件
           - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
           - ORDERER_KAFKA_VERBOSE=true
           - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
           - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
           - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
         working_dir: /opt/gopath/src/github.com/hyperledger/fabric
         command: orderer
         volumes:
           - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
           - ./crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp:/var/hyperledger/orderer/msp
           - ./crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/:/var/hyperledger/orderer/tls
           - orderer0.example.com:/var/hyperledger/production/orderer
         ports:
           - 7050:7050
         extra_hosts:
           - "orderer0.example.com:192.168.1.16"
           - "orderer1.example.com:192.168.1.17"
           - "orderer2.example.com:192.168.1.173"
           - "orderer3.example.com:192.168.1.190"
           - "orderer4.example.com:192.168.1.190"
    
  • 执行命令vim docker-compose-peer.yaml,并将下面代码块中的内容填写到文件中(192.168.1.16)。

     version: '2'
     volumes:
       peer0.org1.example.com:
     services:
       peer0.org1.example.com:
         container_name: peer0.org1.example.com
         hostname: peer0.org1.example.com
         image: hyperledger/fabric-peer:latest
         environment:
           - GODEBUG=netdns=go
           - CORE_PEER_ID=peer0.org1.example.com
           - CORE_PEER_ADDRESS=peer0.org1.example.com:7051	# 当前peer节点的访问地址
           - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org1.example.com:7052	# chaincode的监听地址
           - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051	# 节点被组织外节点感知时的地址
           - CORE_PEER_LOCALMSPID=Org1MSP	# peer节点所属的组织的编号, 在configtxgen.yaml中设置的
           - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock 		# docker服务器的地址
           - FABRIC_LOGGING_SPEC=INFO
           - CORE_PEER_GOSSIP_USELEADERELECTION=true	# 是否自动选举leader节点, 自动:true
           - CORE_PEER_GOSSIP_ORGLEADER=false		# 当前节点是否为leader节点, 是:true
           - CORE_PEER_PROFILE_ENABLED=true
           - CORE_PEER_TLS_ENABLED=true
           - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
           - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
           - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
         working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
         command: peer node start
         volumes:
           - /var/run/:/host/var/run/
           - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
           - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
           - peer0.org1.example.com:/var/hyperledger/production
         ports:
           - 7051:7051
           - 7052:7052
           - 7053:7053
         extra_hosts:
           - "orderer0.example.com:192.168.1.16"
           - "orderer1.example.com:192.168.1.17"
           - "orderer2.example.com:192.168.1.173"
           - "orderer3.example.com:192.168.1.190"
           - "orderer4.example.com:192.168.1.190"
    
  • 执行命令vi docker-compose-cli.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.16)

     version: '2'
     services:
       cli:
         container_name: cli
         image: hyperledger/fabric-tools:latest
         tty: true
         environment:
           - GODEBUG=netdns=go
           - GOPATH=/opt/gopath
           - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
           - FABRIC_LOGGING_SPEC=INFO
           - 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.example.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.example.com/peers/peer0.org1.example.com/tls/ca.crt
           - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
         working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
         volumes:
           - /var/run/:/host/var/run/
           - ./chaincode:/opt/gopath/src/github.com/chaincode
           - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
           - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
         extra_hosts:
           - "orderer0.example.com:192.168.1.16"
           - "orderer1.example.com:192.168.1.17"
           - "orderer2.example.com:192.168.1.173"
           - "orderer3.example.com:192.168.1.190"
           - "orderer4.example.com:192.168.1.190"
           - "peer0.org1.example.com:192.168.1.16"
           - "peer1.org1.example.com:192.168.1.17"
           - "peer2.org1.example.com:192.168.1.173"
           - "peer3.org1.example.com:192.168.1.190"
    
  • 在项目目录下创建脚本,主要是来启动容器和关闭容器的(192.168.1.16)。

    在项目目录下执行 vim up.sh,并将下面代码块中的内容粘贴到文件中,填写完成后执行 chmod +x up.sh 为文件添加执行权限(192.168.1.16)。

     #!/bin/sh
     docker-compose -f ./docker-compose-orderer.yaml up -d
     sleep 10
     docker-compose -f ./docker-compose-peer.yaml up -d
     docker-compose -f ./docker-compose-cli.yaml up -d
    

在项目目录下执行 vim down.sh,并将下面代码块中内容粘贴到文件中,填写完成后执行 chmod +x down.sh 为文件添加执行权限(192.168.1.16)。

sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
docker rmi --force `docker images | grep dev-peer | awk '{print $3}'`

第一台华为云服务器的配置已经完毕了,为什么orderer容器启动后需要等10秒才起别的容器,是因为这些时间是留给各个orderer容器,让他们达成一致的,他们需要这时间去选举leader,这一点官方的脚本是留了15秒的时间。

第二台主机 192.168.1.17

1、进入到项目目录lpgsy下,执行命令vim docker-compose-orderer.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.17)

version: '2'
volumes:
  orderer1.example.com:
services:
  orderer1.example.com:
    container_name: orderer1.example.com
    image: hyperledger/fabric-orderer:latest
    environment:
      - GODEBUG=netdns=go
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
      - ORDERER_KAFKA_VERBOSE=true
      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
      - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
      - ./crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/msp:/var/hyperledger/orderer/msp
      - ./crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/tls/:/var/hyperledger/orderer/tls
      - orderer1.example.com:/var/hyperledger/production/orderer
    ports:
      - 7050:7050
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"

2、执行命令vi docker-compose-peer.yaml,并将下面代码块中的内容填写到文件中(192.168.1.17)。

version: '2'
volumes:
  peer1.org1.example.com:
services:
  peer1.org1.example.com:
    container_name: peer1.org1.example.com
    hostname: peer1.org1.example.com
    image: hyperledger/fabric-peer:latest
    environment:
      - GODEBUG=netdns=go
      - CORE_PEER_ID=peer1.org1.example.com
      - CORE_PEER_ADDRESS=peer1.org1.example.com:7051
      - CORE_PEER_CHAINCODELISTENADDRESS=peer1.org1.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
      - /var/run/:/host/var/run/
      - ./crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp
      - ./crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls
      - peer1.org1.example.com:/var/hyperledger/production
    ports:
      - 7051:7051
      - 7052:7052
      - 7053:7053
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"

3、执行命令docker-compose-cli.yaml,并将下面代码块中的内容填写到文件中(192.168.1.17)。

version: '2'
services:
  cli:
    container_name: cli
    image: hyperledger/fabric-tools:latest
    tty: true
    environment:
      - GODEBUG=netdns=go
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer1.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.example.com/peers/peer1.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/peer1.org1.example.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    volumes:
      - /var/run/:/host/var/run/
      - ./chaincode:/opt/gopath/src/github.com/chaincode
      - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
      - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"
      - "peer0.org1.example.com:192.168.1.16"
      - "peer1.org1.example.com:192.168.1.17"
      - "peer2.org1.example.com:192.168.1.173"
      - "peer3.org1.example.com:192.168.1.190"

4、在项目目录下创建脚本,主要是来启动容器和关闭容器的(192.168.1.17)。
在项目目录下执行 vim up.sh,并将下面代码块中的内容粘贴到文件中,填写完成后执行 chmod +x up.sh 为文件添加执行权限(192.168.1.17)。

#!/bin/sh
docker-compose -f ./docker-compose-orderer.yaml up -d
sleep 10
docker-compose -f ./docker-compose-peer.yaml up -d
docker-compose -f ./docker-compose-cli.yaml up -d

5、在项目目录下执行 vim down.sh,并将下面代码块中内容粘贴到文件中,填写完成后执行 chmod +x down.sh 为文件添加执行权限(192.168.1.17)。

sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
docker rmi --force `docker images | grep dev-peer | awk '{print $3}'`

6、执行到这步,第二台主机也配置完毕

第三台主机 192.168.1.173

1、进入到项目目录lpgsy下,执行命令vim docker-compose-orderer.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.173)

version: '2'
volumes:
  orderer2.example.com:
services:
  orderer2.example.com:
    container_name: orderer2.example.com
    image: hyperledger/fabric-orderer:latest
    environment:
      - GODEBUG=netdns=go
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
      - ORDERER_KAFKA_VERBOSE=true
      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
      - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
      - ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/msp:/var/hyperledger/orderer/msp
      - ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/:/var/hyperledger/orderer/tls
      - orderer2.example.com:/var/hyperledger/production/orderer
    ports:
      - 7050:7050
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"

2、执行vi docker-compose-peer.yaml,并将下面代码块中的内容填写到文件中(192.168.1.173)。

version: '2'
volumes:
  peer2.org1.example.com:
services:
  peer2.org1.example.com:
    container_name: peer2.org1.example.com
    hostname: peer2.org1.example.com
    image: hyperledger/fabric-peer:latest
    environment:
      - GODEBUG=netdns=go
      - CORE_PEER_ID=peer2.org1.example.com
      - CORE_PEER_ADDRESS=peer2.org1.example.com:7051
      - CORE_PEER_CHAINCODELISTENADDRESS=peer2.org1.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
      - /var/run/:/host/var/run/
      - ./crypto-config/peerOrganizations/org1.example.com/peers/peer2.org1.example.com/msp:/etc/hyperledger/fabric/msp
      - ./crypto-config/peerOrganizations/org1.example.com/peers/peer2.org1.example.com/tls:/etc/hyperledger/fabric/tls
      - peer2.org1.example.com:/var/hyperledger/production
    ports:
      - 7051:7051
      - 7052:7052
      - 7053:7053
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"

3、执行vi docker-compose-cli.yaml,并将下面代码块中的内容填写到文件中(192.168.1.173)。

version: '2'
services:
  cli:
    container_name: cli
    image: hyperledger/fabric-tools:latest
    tty: true
    environment:
      - GODEBUG=netdns=go
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer2.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.example.com/peers/peer2.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/peer2.org1.example.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer2.org1.example.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    volumes:
      - /var/run/:/host/var/run/
      - ./chaincode:/opt/gopath/src/github.com/chaincode
      - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
      - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"
      - "peer0.org1.example.com:192.168.1.16"
      - "peer1.org1.example.com:192.168.1.17"
      - "peer2.org1.example.com:192.168.1.173"
      - "peer3.org1.example.com:192.168.1.190"

4、在项目目录下创建脚本,主要是来启动容器和关闭容器的(192.168.1.173)。
在项目目录下执行 vim up.sh,并将下面代码块中的内容粘贴到文件中,填写完成后执行 chmod +x up.sh 为文件添加执行权限(192.168.1.173)。

#!/bin/sh
docker-compose -f ./docker-compose-orderer.yaml up -d
sleep 10
docker-compose -f ./docker-compose-peer.yaml up -d
docker-compose -f ./docker-compose-cli.yaml up -d

5、在项目目录下执行 vim down.sh,并将下面代码块中内容粘贴到文件中,填写完成后执行 chmod +x down.sh 为文件添加执行权限(192.168.1.173)。

sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
docker rmi --force `docker images | grep dev-peer | awk '{print $3}'`

6、执行到这步,第三台主机也配置完毕

第四台主机 192.168.1.190

1、进入到项目目录lpgsy下,执行命令vim docker-compose-orderer.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.190)

version: '2'
volumes:
  orderer3.example.com:
services:
  orderer3.example.com:
    container_name: orderer3.example.com
    image: hyperledger/fabric-orderer:latest
    environment:
      - GODEBUG=netdns=go
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
      - ORDERER_KAFKA_VERBOSE=true
      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
      - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
      - ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/msp:/var/hyperledger/orderer/msp
      - ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/:/var/hyperledger/orderer/tls
      - orderer3.example.com:/var/hyperledger/production/orderer
    ports:
      - 7050:7050
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"

2、执行vi docker-compose-orderer4.yaml,并将下面代码块中的内容填写到文件中(192.168.1.190)。

version: '2'
volumes:
  orderer4.example.com:
services:
  orderer4.example.com:
    container_name: orderer4.example.com
    image: hyperledger/fabric-orderer:latest
    environment:
      - GODEBUG=netdns=go
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
      - ORDERER_KAFKA_VERBOSE=true
      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
      - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
      - ./crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/msp:/var/hyperledger/orderer/msp
      - ./crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/:/var/hyperledger/orderer/tls
      - orderer4.example.com:/var/hyperledger/production/orderer
    ports:
      - 8050:7050
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"

3、执行vi docker-compose-peer.yaml,并将下面代码块中的内容填写到文件中(192.168.1.190)。

version: '2'
volumes:
  peer3.org1.example.com:
services:
  peer3.org1.example.com:
    container_name: peer3.org1.example.com
    hostname: peer3.org1.example.com
    image: hyperledger/fabric-peer:latest
    environment:
      - GODEBUG=netdns=go
      - CORE_PEER_ID=peer3.org1.example.com
      - CORE_PEER_ADDRESS=peer3.org1.example.com:7051
      - CORE_PEER_CHAINCODELISTENADDRESS=peer3.org1.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer3.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
      - /var/run/:/host/var/run/
      - ./crypto-config/peerOrganizations/org1.example.com/peers/peer3.org1.example.com/msp:/etc/hyperledger/fabric/msp
      - ./crypto-config/peerOrganizations/org1.example.com/peers/peer3.org1.example.com/tls:/etc/hyperledger/fabric/tls
      - peer3.org1.example.com:/var/hyperledger/production
    ports:
      - 7051:7051
      - 7052:7052
      - 7053:7053
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"

4、执行vi docker-compose-cli.yaml,并将下面代码块中的内容填写到文件中(192.168.1.190)。

version: '2'
services:
  cli:
    container_name: cli
    image: hyperledger/fabric-tools:latest
    tty: true
    environment:
      - GODEBUG=netdns=go
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer3.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.example.com/peers/peer3.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/peer3.org1.example.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer3.org1.example.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    volumes:
      - /var/run/:/host/var/run/
      - ./chaincode:/opt/gopath/src/github.com/chaincode
      - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
      - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    extra_hosts:
      - "orderer0.example.com:192.168.1.16"
      - "orderer1.example.com:192.168.1.17"
      - "orderer2.example.com:192.168.1.173"
      - "orderer3.example.com:192.168.1.190"
      - "orderer4.example.com:192.168.1.190"
      - "peer0.org1.example.com:192.168.1.16"
      - "peer1.org1.example.com:192.168.1.17"
      - "peer2.org1.example.com:192.168.1.173"
      - "peer3.org1.example.com:192.168.1.190"

5、在项目目录下创建脚本,主要是来启动容器和关闭容器的(192.168.1.190)。
在项目目录下执行 vim up.sh,并将下面代码块中的内容粘贴到文件中,填写完成后执行 chmod +x up.sh 为文件添加执行权限(192.168.1.190)。

#!/bin/sh
docker-compose -f ./docker-compose-orderer.yaml up -d
docker-compose -f ./docker-compose-orderer4.yaml up -d
sleep 10
docker-compose -f ./docker-compose-peer.yaml up -d
docker-compose -f ./docker-compose-cli.yaml up -d

6、在项目目录下执行 vim down.sh,并将下面代码块中内容粘贴到文件中,填写完成后执行 chmod +x down.sh 为文件添加执行权限(192.168.1.190)。

sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
docker rmi --force `docker images | grep dev-peer | awk '{print $3}'`

7、执行到这步,第四台主机也配置完毕

3、设置hosts与拷贝链码

1、设置hosts
由于各个主机在进行交互时,主机名的解析会影响交互速度,所以我们在/etc/hosts中将ip与主机名绑定起来,执行sudo vim /etc/hosts,并将下面代码块中的内容填写到文件中(192.168.1.16)、(192.168.1.17)、(192.168.1.173)、(192.168.1.190)

192.168.1.16 peer0.org1.example.com orderer0.example.com
192.168.1.17 peer1.org1.example.com orderer1.example.com
192.168.1.173 peer2.org1.example.com orderer2.example.com
192.168.1.190 peer3.org1.example.com orderer3.example.com orderer4.example.com

2、拷贝链码
到目前为止,整个网络还缺少一个链码,我们在第一台主机(192.168.1.16)的项目目录下执行mkdir chaincode创建链码目录,执行

cp $HOME/go/src/github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/chaincode_example02.go ./chaincode

将示例的链码拷贝到链码目录中

3、分别进入四台主机的项目目录中,依次执行./up.sh
执行到这一步fabric的网络就已经启动完毕了,下面用cli工具代替客户端去和fabric网络进行交互。

4、通过客户端cli命令行和fabric网络进行交互

第一台主机(192.168.1.16)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器

docker exec -it cli bash

2、执行以下命令创建应用通道

peer channel create -o orderer0.example.com:7050 -c testchannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

3、执行以下命令将当前peer加入通道

peer channel join -b testchannel.block

4、执行以下命令在当前peer上安装链码

peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode

5、执行以下命令将链码打包

peer chaincode package -p github.com/chaincode -n mycc -v 1.0 mycc.1.0.out

6、执行exit,退出当前cli容器
7、在宿主机中执行以下命令将生成的创世快文件从docker的cli容器中拷贝到宿主机

docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/testchannel.block ./channel-artifacts

宿主机中执行以下命令将生成的链码文件从docker的cli容器中拷贝到宿主机

docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/mycc.1.0.out ./channel-artifacts

第二台主机(192.168.1.17)上通过docker客户端对peer节点进行操作
1、将远程主机中的channel-artifacts文件拷贝到本地主机

scp -r gsy@192.168.1.16:$HOME/lpgsy/channel-artifacts ./

2、执行以下命令进入到cli容器

docker exec -it cli bash

3、执行以下命令,将channel-artifacts中的创世块文件以及链码文件拷贝到docker容器内

mv ./channel-artifacts/testchannel.block /opt/gopath/src/github.com/hyperledger/fabric/peer
mv ./channel-artifacts/mycc.1.0.out /opt/gopath/src/github.com/hyperledger/fabric/peer

4、执行以下命令将当前peer加入到通道中

peer channel join -b testchannel.block

5、执行以下命令在当前peer上安装链码

peer chaincode install mycc.1.0.out

第三台主机(192.168.1.173)上通过docker客户端对peer节点进行操作
1、将远程主机中的channel-artifacts文件拷贝到本地主机

scp -r gsy@192.168.1.16:$HOME/lpgsy/channel-artifacts ./

2、执行以下命令进入到cli容器

docker exec -it cli bash

3、执行以下命令,将channel-artifacts中的创世块文件以及链码文件拷贝到docker容器内

mv ./channel-artifacts/testchannel.block /opt/gopath/src/github.com/hyperledger/fabric/peer
mv ./channel-artifacts/mycc.1.0.out /opt/gopath/src/github.com/hyperledger/fabric/peer

4、执行以下命令将当前peer加入到通道中

peer channel join -b testchannel.block

5、执行以下命令在当前peer上安装链码

peer chaincode install mycc.1.0.out

第四台主机(192.168.1.190)上通过docker客户端对peer节点进行操作
1、将远程主机中的channel-artifacts文件拷贝到本地主机

scp -r gsy@192.168.1.16:$HOME/lpgsy/channel-artifacts ./

2、执行以下命令进入到cli容器

docker exec -it cli bash

3、执行以下命令,将channel-artifacts中的创世块文件以及链码文件拷贝到docker容器内

mv ./channel-artifacts/testchannel.block /opt/gopath/src/github.com/hyperledger/fabric/peer
mv ./channel-artifacts/mycc.1.0.out /opt/gopath/src/github.com/hyperledger/fabric/peer

4、执行以下命令将当前peer加入到通道中

peer channel join -b testchannel.block

5、执行以下命令在当前peer上安装链码

peer chaincode install mycc.1.0.out

选择在第一台主机(192.168.1.16)(也可以选择其他主机)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器

docker exec -it cli bash

2、执行以下命令进行初始化链码(实例化链码)就可以在网络内同步,这时会有一个docker容器去运行指定的链码

peer chaincode instantiate -o orderer0.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C testchannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P 'AND ('\''Org1MSP.peer'\'')'

执行以下命令查询a的数据,看是否初始化成功

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

第二台主机(192.168.1.17)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器

docker exec -it cli bash

2、执行以下命令查询b的数据,看是否初始化成功

peer chaincode query -C testchannel -n mycc -c '{"Args":["query","b"]}'

第三台主机(192.168.1.173)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器

docker exec -it cli bash

2、执行以下命令将a的10块钱转账给b

peer chaincode invoke -o orderer0.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C testchannel -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'

第四台主机(192.168.1.190)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器

docker exec -it cli bash

2、执行以下命令查询交互后的a的值

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

至此,基于Raft共识的多机fabric1.4.1网络搭建就已完成

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值