Fabric部署多机版本

    Fabric v1.4.3的First-network默认是单机版本,采用solo模式。下面介绍其多机版本的部署方法,即4 peer+1 order 它们都在不同的机器上运行。

1、节点描述

节点IP说明所在组织
order192.168.30.11排序节点独立
peer0.org1192.168.30.22普通节点org1
peer1.org1192.168.30.33普通节点org1
peer0.org2192.168.30.44普通节点org2
peer1.org2192.168.30.55普通节点org2

2、软件环境

    fabric-samples v1.4.3
    fabric v1.4.3
    fabric ca v1.4.3
    Ubuntu 16.04

3、将First-network复制一份,重命名为one,然后精简one文件夹

3.1 精简first-network

cd $GOPATH/src/github.com/hyperledger/fabric-samples
cp -r first-network one
cd one

    在order节点,对one/文件夹进行精简,得到2个文件夹+7个文件,如图(2)所示:

图(1) first-network复制之后,再精简得到one文件夹

    下面的创世区块、身份证书、通道配置文件,都是通过工具,在$GOPATH/src/github.com/hyperledger/fabric-samples/one里生成的。

3.2 修改端口

    a) 修改one/configtx.yaml里org2的锚节点peer0.org2,将其端口改为7051,如下所示:

        AnchorPeers:
            # AnchorPeers defines the location of peers which can be used
            # for cross org gossip communication.  Note, this value is only
            # encoded in the genesis block in the Application section context
            - Host: peer0.org2.example.com
              Port: 7051  ##修改此处

    b) 修改one/base/docker-compose-base.yaml里4个peer节点的端口,如下:
    order节点,使用7050端口。
    4个peer节点,除了CHAINCODEADDRESS=7052,CHAINCODELISTENADDRESS=7052以外,其他端口统一使用7051。

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

services:

  orderer.example.com:
    container_name: orderer.example.com
    extends:
      file: peer-base.yaml
      service: orderer-base
    volumes:
        - ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
        - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
        - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
        - orderer.example.com:/var/hyperledger/production/orderer
    ports:
      - 7050:7050

  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    extends:
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
    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

  peer1.org1.example.com:
    container_name: peer1.org1.example.com
    extends:
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer1.org1.example.com
      - CORE_PEER_ADDRESS=peer1.org1.example.com:7051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:7052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
    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

  peer0.org2.example.com:
    container_name: peer0.org2.example.com
    extends:
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org2.example.com
      - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:7052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:7051
      - CORE_PEER_LOCALMSPID=Org2MSP
    volumes:
        - /var/run/:/host/var/run/
        - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp
        - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls
        - peer0.org2.example.com:/var/hyperledger/production
    ports:
      - 7051:7051

  peer1.org2.example.com:
    container_name: peer1.org2.example.com
    extends:
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer1.org2.example.com
      - CORE_PEER_ADDRESS=peer1.org2.example.com:7051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer1.org2.example.com:7052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:7051
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051
      - CORE_PEER_LOCALMSPID=Org2MSP
    volumes:
        - /var/run/:/host/var/run/
        - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp
        - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls
        - peer1.org2.example.com:/var/hyperledger/production
    ports:
      - 7051:7051

3.3 制作身份证书

    cryptogen工具通过读取crypto-config.yaml配置文件,来生成组织结构与身份证书

cd ./fabric-sample/one
../bin/cryptogen generate --config=./crypto-config.yaml

3.4 生成创世区块

    configtxgen 工具通过读取 configtx.yaml 配置文件,来生成网络启动的配置文件

## 使能FABRIC_CFG_PATH 变量
export FABRIC_CFG_PATH=$PWD

## 生成创世区块
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

3.5 生成通道配置文件

    创建一个mychannel的通道,并生成通道配置文件channel.tx,其保存在one/channel-artifacts目录下。

export CHANNEL_NAME=mychannel && ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

3.6 生成2个组织的锚节点文件

../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP

../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP

    把这个one文件夹,使用scp命令,或者ftp拷贝其他4个节点。

4、设置/etc/hosts

    order、peer0.org1、peer1.org1、peer0.org2、peer1.org2这5台主机都需要配置/etc/hosts,如下所示。
    a)打开/etc/hosts

sudo vim /etc/hosts

    b) 添加5个域名解析

192.168.30.11 orderer.example.com     
192.168.30.22 peer0.org1.example.com  
192.168.30.33 peer1.org1.example.com  
192.168.30.44 peer0.org2.example.com  
192.168.30.55 peer1.org2.example.com  

    c) 重启网络

sudo /etc/init.d/networking restart

5、设置配置文件

5.1 order节点配置

    a) 复制docker-compose-cli.yaml,并重命名为docker-compose-orderer.yaml

cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-orderer.yaml

    b) 精简docker-compose-orderer.yaml文件,如下:
    //docker-compose-orderer.yaml

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

volumes:
  orderer.example.com:


networks:
  byfn:

services:

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

5.2 peer0.org1节点配置

    a) 复制docker-compose-cli.yaml,并重命名为docker-compose-peer0-Org1.yaml

cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-peer0-Org1.yaml

    b) 精简docker-compose-peer0-Org1.yaml文件,如下:
//docker-compose-peer0-Org1.yaml

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

volumes:
  peer0.org1.example.com:


networks:
  byfn:

services:

  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    extends:
      file:  base/docker-compose-base.yaml
      service: peer0.org1.example.com
    networks:
      - byfn
    extra_hosts:  ##填写与该结点相连的其他节点IP
      - "orderer.example.com:192.168.30.11"
      - "peer1.org1.example.com:192.168.30.33"
      - "peer0.org2.example.com:192.168.30.44"
      - "peer1.org2.example.com:192.168.30.55"     


  cli:
    container_name: cli
    image: hyperledger/fabric-tools:$IMAGE_TAG
    tty: true
    stdin_open: true
    environment:
      - SYS_CHANNEL=$SYS_CHANNEL
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - 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
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ./../chaincode/:/opt/gopath/src/github.com/chaincode
        - ./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
    networks:
      - byfn
    extra_hosts:  ##填写所有的节点IP
      - "orderer.example.com:192.168.30.11"
      - "peer0.org1.example.com:192.168.30.22" 
      - "peer1.org1.example.com:192.168.30.33"
      - "peer0.org2.example.com:192.168.30.44"
      - "peer1.org2.example.com:192.168.30.55"     

5.3 peer1.org1节点配置

    a) 复制docker-compose-cli.yaml,并重命名为docker-compose-peer1-Org1.yaml

cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-peer1-Org1.yaml

    b) 精简docker-compose-peer11-Org1.yaml文件,如下:
    //docker-compose-peer1-Org1.yaml

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

volumes:
  peer1.org1.example.com:


networks:
  byfn:

services:

  peer1.org1.example.com:
    container_name: peer1.org1.example.com
    extends:
      file:  base/docker-compose-base.yaml
      service: peer1.org1.example.com
    networks:
      - byfn
    extra_hosts:  ##填写与该结点相连的其他节点IP
      - "orderer.example.com:192.168.30.11"
      - "peer0.org1.example.com:192.168.30.22" 
      - "peer0.org2.example.com:192.168.30.44"
      - "peer1.org2.example.com:192.168.30.55"   


  cli:
    container_name: cli
    image: hyperledger/fabric-tools:$IMAGE_TAG
    tty: true
    stdin_open: true
    environment:
      - SYS_CHANNEL=$SYS_CHANNEL
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - 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
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ./../chaincode/:/opt/gopath/src/github.com/chaincode
        - ./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:
      - peer1.org1.example.com
    networks:
      - byfn
    extra_hosts:  ##填写所有的节点IP
      - "orderer.example.com:192.168.30.11"
      - "peer0.org1.example.com:192.168.30.22" 
      - "peer1.org1.example.com:192.168.30.33"
      - "peer0.org2.example.com:192.168.30.44"
      - "peer1.org2.example.com:192.168.30.55"     

5.4 peer0.org2节点配置

    a) 复制docker-compose-cli.yaml,并重命名为docker-compose-peer0-Org2.yaml

cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-peer0-Org2.yaml

    b) 精简docker-compose-peer0-Org2.yaml文件,如下:
    //docker-compose-peer0-Org2.yaml

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

volumes:
  peer0.org2.example.com:


networks:
  byfn:

services:

  peer0.org2.example.com:
    container_name: peer0.org2.example.com
    extends:
      file:  base/docker-compose-base.yaml
      service: peer0.org2.example.com
    networks:
      - byfn
    extra_hosts:  
      - "orderer.example.com:192.168.30.11"
      - "peer0.org1.example.com:192.168.30.22" 
      - "peer1.org1.example.com:192.168.30.33"
      - "peer1.org2.example.com:192.168.30.55"   


  cli:
    container_name: cli
    image: hyperledger/fabric-tools:$IMAGE_TAG
    tty: true
    stdin_open: true
    environment:
      - SYS_CHANNEL=$SYS_CHANNEL
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - FABRIC_LOGGING_SPEC=INFO
      - 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.example.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.example.com/peers/peer0.org2.example.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ./../chaincode/:/opt/gopath/src/github.com/chaincode
        - ./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
    networks:
      - byfn
    extra_hosts:  
      - "orderer.example.com:192.168.30.11"
      - "peer0.org1.example.com:192.168.30.22" 
      - "peer1.org1.example.com:192.168.30.33"
      - "peer0.org2.example.com:192.168.30.44"
      - "peer1.org2.example.com:192.168.30.55"     

5.5 peer1.org2节点配置

    a) 复制docker-compose-cli.yaml,并重命名为docker-compose-peer1-Org2.yaml

cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-peer1-Org2.yaml

    b) 精简docker-compose-peer1-Org2.yaml文件,如下:
    //docker-compose-peer1-Org2.yaml

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

volumes:
  peer1.org2.example.com:


networks:
  byfn:

services:

  peer1.org2.example.com:
    container_name: peer1.org2.example.com
    extends:
      file:  base/docker-compose-base.yaml
      service: peer1.org2.example.com
    networks:
      - byfn
    extra_hosts:  
      - "orderer.example.com:192.168.30.11"
      - "peer0.org1.example.com:192.168.30.22" 
      - "peer1.org1.example.com:192.168.30.33"
      - "peer0.org2.example.com:192.168.30.44" 
   


  cli:
    container_name: cli
    image: hyperledger/fabric-tools:$IMAGE_TAG
    tty: true
    stdin_open: true
    environment:
      - SYS_CHANNEL=$SYS_CHANNEL
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer1.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.example.com/peers/peer1.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/peer1.org2.example.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ./../chaincode/:/opt/gopath/src/github.com/chaincode
        - ./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:
      - peer1.org2.example.com
    networks:
      - byfn
    extra_hosts:  
      - "orderer.example.com:192.168.30.11"
      - "peer0.org1.example.com:192.168.30.22" 
      - "peer1.org1.example.com:192.168.30.33"
      - "peer0.org2.example.com:192.168.30.44"
      - "peer1.org2.example.com:192.168.30.55"     

5.6 peer0.org1的CouchDB配置

    a) 复制docker-compose-couch.yaml,并重命名为docker-compose-peer0-Org1-couch.yaml

cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-couch.yaml docker-compose-peer0-Org1-couch.yaml

    b) 精简docker-compose-peer0-Org1-couch.yaml文件,如下:
    //docker-compose-peer0-Org1-couch.yaml

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

networks:
  byfn:

services:
  couchdb0:
    container_name: couchdb0
    image: hyperledger/fabric-couchdb
    # Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
    # for CouchDB.  This will prevent CouchDB from operating in an "Admin Party" mode.
    environment:
      - COUCHDB_USER=
      - COUCHDB_PASSWORD=
    # Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
    # for example map it to utilize Fauxton User Interface in dev environments.
    ports:
      - "5984:5984"
    networks:
      - byfn

  peer0.org1.example.com: ##指定节点域名
    environment:
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
      # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
      # provide the credentials for ledger to connect to CouchDB.  The username and password must
      # match the username and password set for the associated CouchDB.
      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
    depends_on:
      - couchdb0

5.7 peer1.org1的CouchDB配置

    a) 复制docker-compose-couch.yaml,并重命名为docker-compose-peer1-Org1-couch.yaml

cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-couch.yaml docker-compose-peer1-Org1-couch.yaml

    b) 精简docker-compose-peer1-Org1-couch.yaml文件,如下:
    //docker-compose-peer1-Org1-couch.yaml

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

networks:
  byfn:

services:
  couchdb0:
    container_name: couchdb0
    image: hyperledger/fabric-couchdb
    # Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
    # for CouchDB.  This will prevent CouchDB from operating in an "Admin Party" mode.
    environment:
      - COUCHDB_USER=
      - COUCHDB_PASSWORD=
    # Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
    # for example map it to utilize Fauxton User Interface in dev environments.
    ports:
      - "5984:5984"
    networks:
      - byfn

  peer1.org1.example.com: ##指定节点域名
    environment:
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
      # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
      # provide the credentials for ledger to connect to CouchDB.  The username and password must
      # match the username and password set for the associated CouchDB.
      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
    depends_on:
      - couchdb0

5.8 peer0.org2的CouchDB配置

    a) 复制docker-compose-couch.yaml,并重命名为docker-compose-peer0-Org2-couch.yaml

cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-couch.yaml docker-compose-peer0-Org2-couch.yaml

    b) 精简docker-compose-peer0-Org2-couch.yaml文件,如下:
    //docker-compose-peer0-Org2-couch.yaml

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

networks:
  byfn:

services:
  couchdb0:
    container_name: couchdb0
    image: hyperledger/fabric-couchdb
    # Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
    # for CouchDB.  This will prevent CouchDB from operating in an "Admin Party" mode.
    environment:
      - COUCHDB_USER=
      - COUCHDB_PASSWORD=
    # Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
    # for example map it to utilize Fauxton User Interface in dev environments.
    ports:
      - "5984:5984"
    networks:
      - byfn

  peer0.org2.example.com:
    environment:
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
      # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
      # provide the credentials for ledger to connect to CouchDB.  The username and password must
      # match the username and password set for the associated CouchDB.
      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
    depends_on:
      - couchdb0

5.9 peer1.org2的CouchDB配置

    a) 复制docker-compose-couch.yaml,并重命名为docker-compose-peer1-Org2-couch.yaml

cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-couch.yaml docker-compose-peer1-Org2-couch.yaml

    b) 精简docker-compose-peer1-Org2-couch.yaml文件,如下:
    //docker-compose-peer1-Org2-couch.yaml

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

networks:
  byfn:

services:
  couchdb0:
    container_name: couchdb0
    image: hyperledger/fabric-couchdb
    # Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
    # for CouchDB.  This will prevent CouchDB from operating in an "Admin Party" mode.
    environment:
      - COUCHDB_USER=
      - COUCHDB_PASSWORD=
    # Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
    # for example map it to utilize Fauxton User Interface in dev environments.
    ports:
      - "5984:5984"
    networks:
      - byfn

  peer1.org2.example.com:
    environment:
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
      # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
      # provide the credentials for ledger to connect to CouchDB.  The username and password must
      # match the username and password set for the associated CouchDB.
      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
    depends_on:
      - couchdb0

5.10 节点的目录结构

    a) order节点的目录结构

图(1) order节点的目录结构

    b) peer0.org1节点的目录结构

图(2) peer0.org1节点的目录结构

    c) peer1.org1节点的目录结构

图(3) peer1.org1节点的目录结构

    d) peer0.org2节点的目录结构

图(4) peer0.org2节点的目录结构

    f) peer1.org2节点的目录结构

图(f) peer1.org2节点的目录结构

6、启动order和peer节点

6.1 启动order

cd /usr/local/gocode/src/github.com/hyperledger/fabric-samples/one
sudo docker-compose -f docker-compose-orderer.yaml up

6.2 启动peer0.org1

sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml up

6.3 启动peer1.org1

sudo docker-compose -f docker-compose-peer1-Org1.yaml -f docker-compose-peer1-Org1-couch.yaml up

6.4 启动peer0.org2

sudo docker-compose -f docker-compose-peer0-Org2.yaml -f docker-compose-peer0-Org2-couch.yaml up

6.5 启动peer1.org2

sudo docker-compose -f docker-compose-peer1-Org2.yaml -f docker-compose-peer1-Org2-couch.yaml up

7、创建通道文件,并拷贝到其他3个peer节点

    通道文件,保存了通道里的组织个数,它只需要创建一次,把拷贝到各个peer节点即可。这里从peer0.org1节点创建通道文件mychannel.block,然后把它拷贝到peer0.org2、peer1.org1、peer1.org2节点里。具体如下:

7.1 进入peer0.org1的cli容器

docker exec -it cli bash 

7.2 设置环境,并创建通道文件

export CHANNEL_NAME=mychannel
export 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 channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile $ORDERER_CA

    得到mychannel.block,将这个mychannel.block文件,拷贝peer0.org2、peer1.org1、peer.org2的peer目录里,方法如下:

    a)另外打开一个终端2,将mychannel.block从peer0.org 的cli容器拷贝到 one/myblcok文件夹

## 创建myblock文件夹
cd /usr/local/gocode/src/github.com/hyperledger/fabric-samples/one
mkdir myblock

## 将mychannel.block文件拷贝出来
sudo docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block /usr/local/gocode/src/github.com/hyperledger/fabric-samples/one

    b) 然后,用ftp工具把mychannel.block拷贝其他3个peer节点的/usr/local/gocode/src/github.com/hyperledger/fabric-samples/one/myblock目录,
再使用sudo docker cp命令,将其拷贝到peer0.org2、peer1.org1、peer.org2的cli容器里如下所示:

sudo docker cp /usr/local/gocode/src/github.com/hyperledger/fabric-samples/one/myblock/mychannel.block cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/

8、加入通道,并设置锚节点

8.1 将4个peer节点加入通道

    下面这3条命令,分别在4个peer的cli容器,都运行一遍即可。

export CHANNEL_NAME=mychannel
export 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 channel join -b mychannel.block

8.2 设置锚节点,并安装链码

    a) 将peer0.org1设为组织org1的锚节点,同时安装链码

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/chaincode/chaincode_example02/go/

    b) 将peer0.org2设为组织org2的锚节点,同时安装链码

peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile $ORDERER_CA
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/

9、实例化链码,并测试

9.1 实例化

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"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"

9.2 查询

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

9.3 调用

peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -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 --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'

    效果如下:

图(2) 链码的实例化和调用

10、关闭并清空fabric网络

    当不需要使用fabric时,请关闭fabric网络,如下:

10.1 关闭并清空order

sudo docker-compose -f docker-compose-orderer.yaml down 
sudo docker-compose -f docker-compose-orderer.yaml down --volumes

10.2 关闭并清空peer0-Org1

sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml down
sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml down --volumes 

10.3 关闭并清空peer1-Org1

sudo docker-compose -f docker-compose-peer1-Org1.yaml -f docker-compose-peer1-Org1-couch.yaml down
sudo docker-compose -f docker-compose-peer1-Org1.yaml -f docker-compose-peer1-Org1-couch.yaml down --volumes 

10.4 关闭并清空peer0-Org2

sudo docker-compose -f docker-compose-peer0-Org2.yaml -f docker-compose-peer0-Org2-couch.yaml down
sudo docker-compose -f docker-compose-peer0-Org2.yaml -f docker-compose-peer0-Org2-couch.yaml down --volumes 

10.5 关闭并清空peer1-Org2

sudo docker-compose -f docker-compose-peer1-Org2.yaml -f docker-compose-peer1-Org2-couch.yaml down
sudo docker-compose -f docker-compose-peer1-Org2.yaml -f docker-compose-peer1-Org2-couch.yaml down --volumes 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanqima

一键三连,多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值