Fabric2.5.6多机多节点搭建

网络拓扑图:

节点

端口

IP

容器

主机1

orderer0

7050

192.168.202.151

orderer0.example.com

orderer1

7050

192.168.202.151

orderer1.example.com

peer0-org1

7051,7052,7053

192.168.202.151

peer0.org1.example.com

cli

N/A

192.168.202.151

N/A

主机2

orderer2

8050

192.168.202.152

orderer2.example.com

peer0-org2

7051,7052,7053

192.168.202.152

peer0.org2.example.com

peer1-org2

8051,8052,8053

192.168.202.152

peer1.org2.example.com

cli

N/A

192.168.202.152

N/A

主机3

peer0-org3

7051,7052,7053

192.168.202.153

peer0.org3.example.com

peer1-org3

8051,8052,8053

192.168.202.153

peer1.org3.example.com

cli

N/A

192.168.202.153

N/A

项目部分分支结构

搭建前需要注意事项(实验环境):

ubuntu版本为24.04TLS

go版本为1.21.6

docker images为2.5.6

Faric25.1 中部署 2个orderer、1个peer0.org1、cli

Faric25.2 中部署 1个orderer、2个peer0.org2、peer1.org2、cli

Faric25.3 中部署 2个peer0.org3、peer1.org3、cli

1.三台机器修改主机配置文件都要修改

 执行命令:sudo vim /etc/hosts

192.168.202.151 orderer0.example.com

192.168.202.151 orderer1.example.com

192.168.202.151 peer0.org1.example.com

192.168.202.152 orderer2.example.com

192.168.202.152 peer0.org2.example.com

192.168.202.152 peer1.org2.example.com

192.168.202.153 peer0.org3.example.com

192.168.202.153 peer1.org3.example.com

2.在一台主机生成好配置文件然后复制到另外的主机上(生成证书和通道的步骤和单机搭建完全一样,三台虚拟机的项目路径要完全一致)

2.1获取root权限(使用scp命令时退出root模式即可)

sudo su

2.2进入fabric-samples文件夹下,三台虚拟机都要操作

mkdir multiple-deployment

cd multiple-deployment

2.3以下是主机1的操作,复制fabric-samples中测试网络的链码(智能合约)到chaincode/go下

mkdir -p chaincode/go

cp -r ../asset-transfer-basic/chaincode-go/* chaincode/go

2.4下载链码的依赖包

cd chaincode/go

go env -w GOPROXY=https://goproxy.io,direct

go env -w GO111MODULE=on

go mod vendor

使用命令解开权限:

sudo chown -R $(whoami) /home/fabric2-5/go/src/github.com/hyperledger/fabric-samples/multiple-deployment/chaincode/go/vendor

ls

生成之后可以看到在go文件夹下面生成了存放链码(智能合约)依赖的vendor文件夹

3.生成证书以及通道配置

3.1主机1的操作:

3.1.1在multiple-deployment文件夹下新建crypto-config.yaml文件和configtx.yaml文件

cd ../..

touch crypto-config.yaml

touch configtx.yaml

3.1.2将以下内容写进crypto-config.yaml文件中
OrdererOrgs:

  - Name: Orderer

    Domain: example.com

    Specs:

      - Hostname: orderer0

      - Hostname: orderer1

      - Hostname: orderer2



PeerOrgs:

  - Name: Org1

    Domain: org1.example.com

    EnableNodeOUs: true

    Template:

      Count: 1

    Users:

      Count: 1

  - Name: Org2

    Domain: org2.example.com

    EnableNodeOUs: true

    Template:

      Count: 2

    Users:

      Count: 1

- Name: Org3

    Domain: org3.example.com

    EnableNodeOUs: true

    Template:

      Count: 2

    Users:

      Count: 1
3.1.3将以下内容写进configtx.yaml文件中
Organizations:

    - &OrdererOrg

        Name: OrdererOrg

        ID: OrdererMSP

        MSPDir: crypto-config/ordererOrganizations/example.com/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

        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp

        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')"

            Endorsement:

                Type: Signature

                Rule: "OR('Org1MSP.peer')"



        AnchorPeers:

            - Host: peer0.org1.example.com

              Port: 7051

    - &Org2

        Name: Org2MSP

        ID: Org2MSP

        MSPDir: crypto-config/peerOrganizations/org2.example.com/msp

        Policies:

            Readers:

                Type: Signature

                Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')"

            Writers:

                Type: Signature

                Rule: "OR('Org2MSP.admin', 'Org2MSP.client')"

            Admins:

                Type: Signature

                Rule: "OR('Org2MSP.admin')"

            Endorsement:

                Type: Signature

                Rule: "OR('Org2MSP.peer')"



        AnchorPeers:

            - Host: peer0.org2.example.com

              Port: 7051

    - &Org3

        Name: Org3MSP

        ID: Org3MSP

        MSPDir: crypto-config/peerOrganizations/org3.example.com/msp

        Policies:

            Readers:

                Type: Signature

                Rule: "OR('Org3MSP.admin', 'Org3MSP.peer', 'Org3MSP.client')"

            Writers:

                Type: Signature

                Rule: "OR('Org3MSP.admin', 'Org3MSP.client')"

            Admins:

                Type: Signature

                Rule: "OR('Org3MSP.admin')"

            Endorsement:

                Type: Signature

                Rule: "OR('Org3MSP.peer')"



        AnchorPeers:

            - Host: peer0.org3.example.com

              Port: 7051



Capabilities:

    Channel: &ChannelCapabilities

        V2_0: true

    Orderer: &OrdererCapabilities

        V2_0: true

    Application: &ApplicationCapabilities

        V2_0: true



Application: &ApplicationDefaults



    Organizations:



    Policies:

        Readers:

            Type: ImplicitMeta

            Rule: "ANY Readers"

        Writers:

            Type: ImplicitMeta

            Rule: "ANY Writers"

        Admins:

            Type: ImplicitMeta

            Rule: "MAJORITY Admins"

        LifecycleEndorsement:

            Type: ImplicitMeta

            Rule: "MAJORITY Endorsement"

        Endorsement:

            Type: ImplicitMeta

            Rule: "MAJORITY Endorsement"



    Capabilities:

        <<: *ApplicationCapabilities



Orderer: &OrdererDefaults



    OrdererType: etcdraft



    Addresses: # orderer 集群节点

        - orderer0.example.com:7050

        - orderer1.example.com:8050

        - orderer2.example.com:7050

    # Batch Timeout: The amount of time to wait before creating a batch

    BatchTimeout: 2s



    # Batch Size: Controls the number of messages batched into a block

    BatchSize:



        MaxMessageCount: 10



        AbsoluteMaxBytes: 99 MB



        PreferredMaxBytes: 512 KB



    Organizations:



    Policies:

        Readers:

            Type: ImplicitMeta

            Rule: "ANY Readers"

        Writers:

            Type: ImplicitMeta

            Rule: "ANY Writers"

        Admins:

            Type: ImplicitMeta

            Rule: "MAJORITY Admins"

        # BlockValidation specifies what signatures must be included in the block

        # from the orderer for the peer to validate it.

        BlockValidation:

            Type: ImplicitMeta

            Rule: "ANY Writers"



Channel: &ChannelDefaults



    Policies:

        # Who may invoke the 'Deliver' API

        Readers:

            Type: ImplicitMeta

            Rule: "ANY Readers"

        # Who may invoke the 'Broadcast' API

        Writers:

            Type: ImplicitMeta

            Rule: "ANY Writers"

        # By default, who may modify elements at this config level

        Admins:

            Type: ImplicitMeta

            Rule: "MAJORITY Admins"



    Capabilities:

        <<: *ChannelCapabilities



Profiles:



    ThreeOrgsChannel:

        Consortium: SampleConsortium

        <<: *ChannelDefaults

        Application:

            <<: *ApplicationDefaults

            Organizations:

                - *Org1

                - *Org2

                - *Org3

            Capabilities:

                <<: *ApplicationCapabilities



    SampleMultiNodeEtcdRaft:

        <<: *ChannelDefaults

        Capabilities:

            <<: *ChannelCapabilities

        Orderer:

            <<: *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: 8050

                  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

            Addresses:

                - orderer0.example.com:7050

                - orderer1.example.com:8050

                - orderer2.example.com:7050

            Organizations:

            - *OrdererOrg

            Capabilities:

                <<: *OrdererCapabilities

        Application:

            <<: *ApplicationDefaults

            Organizations:

            - <<: *OrdererOrg

        Consortiums:

            SampleConsortium:

                Organizations:

                - *Org1

                - *Org2

                - *Org3

3.1.4主机1的操作:通过cryptogen命令生成证书配置

cryptogen generate --config=./crypto-config.yaml

3.1.5通过configtxgen命令生成创世区块

configtxgen -profile SampleMultiNodeEtcdRaft -channelID multiple-deployment-channel -outputBlock ./channel-artifacts/genesis.block

3.1.6通过configtxgen命令生成通道配置

configtxgen -profile ThreeOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel

3.1.7定义锚节点

定义组织1的锚节点(也称主节点)

configtxgen -profile ThreeOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP

定义组织2的锚节点

configtxgen -profile ThreeOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

定义组织3的锚节点

configtxgen -profile ThreeOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org3MSPanchors.tx -channelID mychannel -asOrg Org3MSP

3.1.8将channel-artifacts和crypto-config这两个文件夹拷贝到主机2、3中。(注意一定要用主机1中的这两个文件,不要用以上操作在继续在主机2、3中在执行一遍,这样生成的证书不同,稍后无法建立连接,user指虚拟机用户名ip就是使用ifconfig命令后ens33接口处的ip地址)

scp -r channel-artifacts user@ip地址:/home/fabric2-5/go/src/github.com/hyperledger/fabric-samples/multiple-deployment/

scp -r crypto-config user@ip地址:/home/fabric2-5/go/src/github.com/hyperledger/fabric-samples/multiple-deployment/

scp -r channel-artifacts user@ip地址:/home/fabric2-5/go/src/github.com/hyperledger/fabric-samples/multiple-deployment/

scp -r crypto-config user@ip地址:/home/fabric2-5/go/src/github.com/hyperledger/fabric-samples/multiple-deployment/

4.编写网络启动脚本并启动网络

4.1主机1的操作:

touch docker-compose-up.yaml

将以下内容写入docker-compose-up.yaml中,yaml文件中,IP修改为自己设置的IP

version: '2'



services:

  orderer0.example.com:

    container_name: orderer0.example.com

    image: hyperledger/fabric-orderer:2.5.6

    environment:

      - FABRIC_LOGGING_SPEC=DEBUG

      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0

      - ORDERER_GENERAL_BOOTSTRAPMETHOD=file

      - ORDERER_GENERAL_BOOTSTRAPFILE=/var/hyperledger/orderer/orderer.genesis.block

      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP

      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp

      # enabled TLS

      - 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_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

    ports:

      - 7050:7050

    extra_hosts:

      - "orderer0.example.com:192.168.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"



  orderer1.example.com:

    container_name: orderer1.example.com

    image: hyperledger/fabric-orderer:2.5.6

    environment:

      - FABRIC_LOGGING_SPEC=INFO

      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0

      - ORDERER_GENERAL_BOOTSTRAPMETHOD=file

      - ORDERER_GENERAL_BOOTSTRAPFILE=/var/hyperledger/orderer/orderer.genesis.block

      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP

      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp

      # enabled TLS

      - 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_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

    ports:

      - 8050:8050

    extra_hosts:

      - "orderer0.example.com:192.168.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"



  peer0.org1.example.com:

    container_name: peer0.org1.example.com

    image: hyperledger/fabric-peer:2.5.6

    environment:

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      - 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=peer0.org1.example.com:7051

      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051

      - CORE_PEER_LOCALMSPID=Org1MSP

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_GOSSIP_USELEADERELECTION=true

      - CORE_PEER_GOSSIP_ORGLEADER=false

      - CORE_PEER_PROFILE_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

      # Allow more time for chaincode container to build on install.

      - CORE_CHAINCODE_EXECUTETIMEOUT=300s

    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

    ports:

      - 7051:7051

      - 7052:7052

      - 7053:7053

    extra_hosts:

      - "orderer0.example.com:192.168.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"





  cli1:

    container_name: cli1

    image: hyperledger/fabric-tools:2.5.6

    tty: true

    stdin_open: true

    environment:

      - GOPATH=/opt/gopath

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      #- FABRIC_LOGGING_SPEC=DEBUG

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_ID=cli1

      - 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/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/go

        - ./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.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"

      - "peer0.org1.example.com:192.168.202.151"

      - "peer0.org2.example.com:192.168.202.152"

      - "peer0.org3.example.com:192.168.202.153"

      - "peer1.org2.example.com:192.168.202.152"

      - "peer1.org3.example.com:192.168.202.153"

4.2主机2的操作:

touch docker-compose-up.yaml

将以下内容写入docker-compose-up.yaml中,yaml文件中,同样修改为自己的IP

version: '2'



services:

  orderer2.example.com:

    container_name: orderer2.example.com

    image: hyperledger/fabric-orderer:2.5.6

    environment:

      - FABRIC_LOGGING_SPEC=INFO

      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0

      - ORDERER_GENERAL_BOOTSTRAPMETHOD=file

      - ORDERER_GENERAL_BOOTSTRAPFILE=/var/hyperledger/orderer/orderer.genesis.block

      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP

      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp

      # enabled TLS

      - 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_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

    ports:

      - 7050:7050

    extra_hosts:

      - "orderer0.example.com:192.168.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"



  peer0.org2.example.com:

    container_name: peer0.org2.example.com

    image: hyperledger/fabric-peer:2.5.6

    environment:

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      - 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=peer0.org2.example.com:7051

      - CORE_PEER_LOCALMSPID=Org2MSP

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_GOSSIP_USELEADERELECTION=true

      - CORE_PEER_GOSSIP_ORGLEADER=false

      - CORE_PEER_PROFILE_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

      # Allow more time for chaincode container to build on install.

      - CORE_CHAINCODE_EXECUTETIMEOUT=300s

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer

    command: peer node start

    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

    ports:

      - 7051:7051

      - 7052:7052

      - 7053:7053

    extra_hosts:

      - "orderer0.example.com:192.168.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"



  peer1.org2.example.com:

    container_name: peer1.org2.example.com

    image: hyperledger/fabric-peer:2.5.6

    environment:

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      - CORE_PEER_ID=peer1.org2.example.com

      - CORE_PEER_ADDRESS=peer1.org2.example.com:8051

      - CORE_PEER_LISTENADDRESS=0.0.0.0:8051

      - CORE_PEER_CHAINCODEADDRESS=peer1.org2.example.com:8052

      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052

      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:8051

      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:8051

      - CORE_PEER_LOCALMSPID=Org2MSP

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_GOSSIP_USELEADERELECTION=true

      - CORE_PEER_GOSSIP_ORGLEADER=false

      - CORE_PEER_PROFILE_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

      # Allow more time for chaincode container to build on install.

      - CORE_CHAINCODE_EXECUTETIMEOUT=300s

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer

    command: peer node start

    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

    ports:

      - 8051:8051

      - 8052:8052

      - 8053:8053

    extra_hosts:

      - "orderer0.example.com:192.168.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"



  cli1:

    container_name: cli1

    image: hyperledger/fabric-tools:2.5.6

    tty: true

    stdin_open: true

    environment:

      - GOPATH=/opt/gopath

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      #- FABRIC_LOGGING_SPEC=DEBUG

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_ID=cli1

      - 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/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/go

        - ./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.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"

      - "peer0.org1.example.com:192.168.202.151"

      - "peer0.org2.example.com:192.168.202.152"

      - "peer0.org3.example.com:192.168.202.153"

      - "peer1.org2.example.com:192.168.202.152"

      - "peer1.org3.example.com:192.168.202.153"



  cli2:

    container_name: cli2

    image: hyperledger/fabric-tools:2.5.6

    tty: true

    stdin_open: true

    environment:

      - GOPATH=/opt/gopath

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      #- FABRIC_LOGGING_SPEC=DEBUG

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_ID=cli2

      - CORE_PEER_ADDRESS=peer1.org2.example.com:8051

      - 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/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/go

        - ./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.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"

      - "peer0.org1.example.com:192.168.202.151"

      - "peer0.org2.example.com:192.168.202.152"

      - "peer0.org3.example.com:192.168.202.153"

      - "peer1.org2.example.com:192.168.202.152"

      - "peer1.org3.example.com:192.168.202.153"

4.3主机3的操作:

touch docker-compose-up.yaml

将以下内容写入docker-compose-up.yaml中,yaml文件中,记得改IP

version: '2'



services:



  peer0.org3.example.com:

    container_name: peer0.org3.example.com

    image: hyperledger/fabric-peer:2.5.6

    environment:

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      - CORE_PEER_ID=peer0.org3.example.com

      - CORE_PEER_ADDRESS=peer0.org3.example.com:7051

      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051

      - CORE_PEER_CHAINCODEADDRESS=peer0.org3.example.com:7052

      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052

      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org3.example.com:7051

      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org3.example.com:7051

      - CORE_PEER_LOCALMSPID=Org3MSP

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_GOSSIP_USELEADERELECTION=true

      - CORE_PEER_GOSSIP_ORGLEADER=false

      - CORE_PEER_PROFILE_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

      # Allow more time for chaincode container to build on install.

      - CORE_CHAINCODE_EXECUTETIMEOUT=300s

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer

    command: peer node start

    volumes:

       - /var/run/:/host/var/run/

       - ./crypto-config/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/msp:/etc/hyperledger/fabric/msp

       - ./crypto-config/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls:/etc/hyperledger/fabric/tls

    ports:

      - 7051:7051

      - 7052:7052

      - 7053:7053

    extra_hosts:

      - "orderer0.example.com:192.168.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"



  peer1.org3.example.com:

    container_name: peer1.org3.example.com

    image: hyperledger/fabric-peer:2.5.6

    environment:

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      - CORE_PEER_ID=peer1.org3.example.com

      - CORE_PEER_ADDRESS=peer1.org3.example.com:8051

      - CORE_PEER_LISTENADDRESS=0.0.0.0:8051

      - CORE_PEER_CHAINCODEADDRESS=peer1.org3.example.com:8052

      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052

      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org3.example.com:8051

      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org3.example.com:8051

      - CORE_PEER_LOCALMSPID=Org3MSP

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_GOSSIP_USELEADERELECTION=true

      - CORE_PEER_GOSSIP_ORGLEADER=false

      - CORE_PEER_PROFILE_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

      # Allow more time for chaincode container to build on install.

      - CORE_CHAINCODE_EXECUTETIMEOUT=300s

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer

    command: peer node start

    volumes:

       - /var/run/:/host/var/run/

       - ./crypto-config/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/msp:/etc/hyperledger/fabric/msp

       - ./crypto-config/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls:/etc/hyperledger/fabric/tls

    ports:

      - 8051:8051

      - 8052:8052

      - 8053:8053

    extra_hosts:

      - "orderer0.example.com:192.168.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"



  cli1:

    container_name: cli1

    image: hyperledger/fabric-tools:2.5.6

    tty: true

    stdin_open: true

    environment:

      - GOPATH=/opt/gopath

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      #- FABRIC_LOGGING_SPEC=DEBUG

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_ID=cli1

      - CORE_PEER_ADDRESS=peer0.org3.example.com:7051

      - CORE_PEER_LOCALMSPID=Org3MSP

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/server.crt

      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/server.key

      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt

      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer

    command: /bin/bash

    volumes:

        - /var/run/:/host/var/run/

        - ./chaincode/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/go

        - ./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.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"

      - "peer0.org1.example.com:192.168.202.151"

      - "peer0.org2.example.com:192.168.202.152"

      - "peer0.org3.example.com:192.168.202.153"

      - "peer1.org2.example.com:192.168.202.152"

      - "peer1.org3.example.com:192.168.202.153"



  cli2:

    container_name: cli2

    image: hyperledger/fabric-tools:2.5.6

    tty: true

    stdin_open: true

    environment:

      - GOPATH=/opt/gopath

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      #- FABRIC_LOGGING_SPEC=DEBUG

      - FABRIC_LOGGING_SPEC=INFO

      - CORE_PEER_ID=cli2

      - CORE_PEER_ADDRESS=peer1.org3.example.com:8051

      - CORE_PEER_LOCALMSPID=Org3MSP

      - CORE_PEER_TLS_ENABLED=true

      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls/server.crt

      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls/server.key

      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls/ca.crt

      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer

    command: /bin/bash

    volumes:

        - /var/run/:/host/var/run/

        - ./chaincode/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/go

        - ./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.202.151"

      - "orderer1.example.com:192.168.202.151"

      - "orderer2.example.com:192.168.202.152"

      - "peer0.org1.example.com:192.168.202.151"

      - "peer0.org2.example.com:192.168.202.152"

      - "peer0.org3.example.com:192.168.202.153"

      - "peer1.org2.example.com:192.168.202.152"

      - "peer1.org3.example.com:192.168.202.153"

5.接下来在三台虚拟机上启动网络

主机1,2,3:

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

出现上面错误可以使用命令:

sudo usermod -aG docker fabric2-5(此处应为你的用户名)

newgrp  -  docker

cd ~/go/src/github.com/hyperledger/fabric-samples/multiple-deployment重新回到目录

继续使用命令:docker-compose -f docker-compose-up.yaml up -d

即可成功

注意虚拟机中docker分别开启的是否是org1和org2和org3

5.1虚拟机1的操作:

5.1.1进入cli1容器,也就是以peer0.org1的角色与网络交互

docker exec -it cli1 bash

5.1.2创建通道,这一步最好等网络跑起来15秒之后再操作,因为orderer之间要握手和选举raft领导节点,需要点时间。操作太快会报no Raft leader的错误(如遇到就重启docker吧)

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

5.1.3组织1的peer0节点加入通道mychannel

peer channel join -b mychannel.block

5.1.4更新组织1的锚节点

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

5.1.5退出cli1容器,从cli1容器中拷贝出mychannel.block文件到multiple-deployment文件夹下,并复制到虚拟机2,3中

exit

docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block ./

scp mychannel.block user@ip地址:/home/fabric2-5/go/src/github.com/hyperledger/fabric-samples/multiple-deployment/

scp mychannel.block user@ip地址:/home/fabric2-5/go/src/github.com/hyperledger/fabric-samples/multiple-deployment/

5.2接下来是虚拟机2的操作

5.2.1将mychannel.block拷贝到虚拟机2的cli1(组织2的peer0角色)容器中

docker cp mychannel.block cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/

5.2.2进入cli1容器

docker exec -it cli1 bash

peer channel join -b mychannel.block

5.2.3更新组织2的锚节点(主节点)

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

5.3接下来是虚拟机3的操作

5.3.1将mychannel.block拷贝到虚拟机3的cli1(组织3的peer0角色)容器中

docker cp mychannel.block cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/

5.3.2进入cli1容器

docker exec -it cli1 bash

peer channel join -b mychannel.block

5.3.3更新组织3的锚节点(主节点)

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

6.安装与调用链码(智能合约)

6.1虚拟机1的操作:

6.1.1进入cli1容器中

docker exec -it cli1 bash

peer lifecycle chaincode package mycc.tar.gz --path ../../multiple-deployment/chaincode/go --lang golang --label mycc_1

注:此处一定要注意--path的路径,可以先pwd查询当前路径,然后再去找链码包路径

注:此时“可能”会报错:Error: error getting chaincode bytes: ‘go list’ failed with: no required module provides package github.com/hyperledger/multiple-deployment/chaincode/go: go.mod file not found in current directory or any parent directory; see ‘go help modules’: exit status 1

输入以下代码后,在重新执行上一句即可

go env -w GO111MODULE=auto

6.1.2安装链码:

peer lifecycle chaincode install mycc.tar.gz

6.1.3退出cli1容器,将打包的链码mycc.tar.gz从cli1容器中提取出来,并拷贝到虚拟机2,3的multiple-deployment目录下

exit

docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/mycc.tar.gz ./

scp mycc.tar.gz user@IP地址:/home/fabric2-5/go/src/github.com/hyperledger/fabric-samples/multiple-deployment/

scp mycc.tar.gz user@IP地址:/home/fabric2-5/go/src/github.com/hyperledger/fabric-samples/multiple-deployment/

6.2接下来进行虚拟机2的操作:

6.2.1退出cli1容器,将multiple-deployment目录下的链码压缩包mycc.tar.gz复制到cli1(组织2的peer0)容器

exit

docker cp mycc.tar.gz cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/

6.2.3再次进入cli1容器,安装链码

docker exec -it cli1 bash

peer lifecycle chaincode install mycc.tar.gz

将下面这个代码中的相应位置改成上面选中的链码id

组织2同意提交链码,下面指令中的链码id记得替换成上一条指令生成的链码id

peer lifecycle chaincode approveformyorg --channelID mychannel --name mycc --version 1.0 --init-required --package-id mycc_1:d73c3c1bd165e7af6c7c8bd347a336715a3da58025a95d29e90a6fd5b8a0ccb4 --sequence 1 --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

6.3接下来进行虚拟机3的操作:

6.3.1退出cli1容器,将multiple-deployment目录下的链码压缩包mycc.tar.gz复制到cli1(组织2的peer0)容器

exit

docker cp mycc.tar.gz cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/

6.3.3再次进入cli1容器,安装链码

docker exec -it cli1 bash

peer lifecycle chaincode install mycc.tar.gz

将下面这个代码中的相应位置改成上面选中的链码id

组织3同意提交链码,下面指令中的链码id记得替换成上一条指令生成的链码id

peer lifecycle chaincode approveformyorg --channelID mychannel --name mycc --version 1.0 --init-required --package-id mycc_1:d73c3c1bd165e7af6c7c8bd347a336715a3da58025a95d29e90a6fd5b8a0ccb4 --sequence 1 --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

6.4接下来到虚拟机1的操作:

6.4.1再次进入cli1容器,同意提交链码

docker exec -it cli1 bash

peer lifecycle chaincode approveformyorg --channelID mychannel --name mycc --version 1.0 --init-required --package-id mycc_1:d73c3c1bd165e7af6c7c8bd347a336715a3da58025a95d29e90a6fd5b8a0ccb4 --sequence 1 --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

6.4.2看链码的状态是否就绪

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name mycc --version 1.0 --init-required --sequence 1 --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 --output json

6.4.3提交链码

peer lifecycle chaincode commit -o orderer0.example.com:7050 --channelID mychannel --name mycc --version 1.0 --sequence 1 --init-required --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 --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 --peerAddresses peer0.org3.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt

6.4.4初始化链码

peer chaincode invoke -o orderer0.example.com:7050 --isInit --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 mychannel -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 --peerAddresses peer0.org3.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}' --waitForEvent

6.5拟机1查询已添加到通道分类账的资产列表

peer chaincode query -C mychannel -n mycc -c '{"Args":["GetAllAssets"]}'

6.6使用以下命令通过调用资产转移(基本)链码来更改分类账上资产的所有者:

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 mychannel -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 --peerAddresses peer0.org3.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}' --waitForEvent

6.7虚拟机3查询正在运行的资产转移(基本)链码:

peer chaincode query -C mychannel -n mycc -c '{"Args":["ReadAsset","asset6"]}'

至此证明三台虚拟机操作已经在fabric网络中节点同步

7.退出网络

可以在退出cli1容器后使用以下指令退出

docker-compose -f docker-compose-up.yaml down

注:docker-compose-up.yaml文件中还有各组织1、2的peer1节点,容器名为cli2,可以进入容器中使他们加入网络,同步消息,操作与peer0一样

最后感谢水芹菜博主的文章

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值