天天看點

fabric手動多機部署

網絡中有1個orderer節點,4個組織,每個組織各有1個節點。

名稱 ip 節點Hostname Organization
Server 1 10.11.6.118 orderer.example.com
Server 2 10.11.6.118 peer0.org1.example.com org1
Server 3 10.11.6.119 peer0.org2.example.com org2
Server 4 10.11.6.120 peer0.org3.example.com org3
Server 5 10.11.6.121 peer0.org4.example.com org4

本文檔要求本地機器已經配置好fabric,并能單機運作4+1 Fabric執行個體

cd fabric/example/e2e_cli

啟動腳本測試本地網絡

./network_setup.sh up
關閉本地測試
./network_setup.sh down

導入環境變量
export FABRIC_ROOT=$PWD/../..
export FABRIC_CFG_PATH=$PWD

修改configtx.yaml檔案

vim configtx.yaml

修改如下,注意中間不得有空格與換行

Profiles:

    FourOrgsOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
                    - *Org3
                    - *Org4
    FourOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
                - *Org3
                - *Org4

	本檔案Organizations中添加org3、org4:

    - &Org3
        Name: Org3MSP
        ID: Org3MSP
        MSPDir: crypto-config/peerOrganizations/org3.example.com/msp
        AnchorPeers:
            - Host: peer0.org3.example.com
              Port: 7051

    - &Org4
        Name: Org4MSP
        ID: Org4MSP
        MSPDir: crypto-config/peerOrganizations/org4.example.com/msp
        AnchorPeers:
            - Host: peer0.org4.example.com
              Port: 7051

   删除crypto-config channel-artifacts
   
   rm -rf crypto-config channel-artifacts

     修改base檔案
      
     cd /base
	 vim docker-compose-base.yaml 
	 
    修改各peer

    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_CHAINCODELISTENADDRESS=peer0.org1.example.com:7052
      - 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
    ports:
      - 7051:7051
      - 7052:7052
      - 7053:7053
     
 peer0.org2.example.com:
    container_name: peer2.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_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.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/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

peer0.org3.example.com:
    container_name: peer0.org3.example.com
    extends:
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org3.example.com
      - CORE_PEER_ADDRESS=peer0.org3.example.com:7051
      - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org3.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org3.example.com:7051
      - CORE_PEER_LOCALMSPID=Org3MSP
    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

 peer0.org4.example.com:
    container_name: peer0.org4.example.com
    extends:
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org4.example.com
      - CORE_PEER_ADDRESS=peer0.org4.example.com:7051
      - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org4.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org4.example.com:7051
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org4.example.com:7051
      - CORE_PEER_LOCALMSPID=Org4MSP
    volumes:
        - /var/run/:/host/var/run/
        - ../crypto-config/peerOrganizations/org4.example.com/peers/peer0.org4.example.com/msp:/etc/hyperledger/fabric/msp
        - ../crypto-config/peerOrganizations/org4.example.com/peers/peer0.org4.example.com/tls:/etc/hyperledger/fabric/tls
    ports:
      - 7051:7051
      - 7052:7052
      - 7053:7053

修改crypto-config.yaml

将每個PeerOrgs的 Template和user都設為1,添加Org3和org4

  - Name: Org2
    Domain: org2.example.com
    Template:
      Count: 1
    Users:
      Count: 1

  - Name: Org3
    Domain: org3.example.com
    Template:
      Count: 1
    Users:
      Count: 1

  - Name: Org4
    Domain: org4.example.com
    Template:
      Count: 1
    Users:
      Count: 

生成公私鑰和證書

傳回e2e_cli

cd ..

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

生成的檔案都儲存到crypto-config檔案夾,我們可以進入該檔案夾檢視生成了哪些檔案

替換私鑰

cp docker-compose-e2e-template.yaml docker-compose-e2e.yaml

cd crypto-config/peerOrganizations/org1.example.com/ca/

此檔案夾下有私鑰,将其複制到docker-compose-e2e.yaml的FABRIC_CA_SERVER_TLS_KEYFILE

vim docker-compose-e2e.yaml

将每個證書  
FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/94901ee513fedeaabaa8468df8d20aa351cd6ce5f690b8944b9da44998c60cbf_sk

對于其他3個組織一樣如此。并且對此檔案證書下面的内容做修改

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

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

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

  peer0.org4.example.com:
    container_name: peer0.org4.example.com
    extends:
      file:  base/docker-compose-base.yaml
      service: peer0.org4.example.com
                sh up
關閉本地測試
./network_setup.sh down

導入環境變量
export FABRIC_ROOT=$PWD/../..
export FABRIC_CFG_PATH=$PWD

修改configtx.yaml檔案

vim configtx.yaml

修改如下,注意中間不得有空格與換行

Profiles:

    FourOrgsOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
                    - *Org3
                    - *Org4
    FourOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
                - *Org3
                - *Org4

	本檔案Organizations中添加org3、org4:

    - &Org3
        Name: Org3MSP
        ID: Org3MSP
        MSPDir: crypto-config/peerOrganizations/org3.example.com/msp
        AnchorPeers:
            - Host: peer0.org3.example.com
              Port: 7051

    - &Org4
        Name: Org4MSP
        ID: Org4MSP
        MSPDir: crypto-config/peerOrganizations/org4.example.com/msp
        AnchorPeers:
            - Host: peer0.org4.example.com
              Port: 7051

   删除crypto-config channel-artifacts
   
   rm -rf crypto-config channel-artifacts

     修改base檔案
      
     cd /base
	 vim docker-compose-base.yaml 
	 
    修改各peer

    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_CHAINCODELISTENADDRESS=peer0.org1.example.com:7052
      - 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
    ports:
      - 7051:7051
      - 7052:7052
      - 7053:7053
     
 peer0.org2.example.com:
    container_name: peer2.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_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.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/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

peer0.org3.example.com:
    container_name: peer0.org3.example.com
    extends:
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org3.example.com
      - CORE_PEER_ADDRESS=peer0.org3.example.com:7051
      - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org3.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org3.example.com:7051
      - CORE_PEER_LOCALMSPID=Org3MSP
    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

 peer0.org4.example.com:
    container_name: peer0.org4.example.com
    extends:
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org4.example.com
      - CORE_PEER_ADDRESS=peer0.org4.example.com:7051
      - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org4.example.com:7052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org4.example.com:7051
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org4.example.com:7051
      - CORE_PEER_LOCALMSPID=Org4MSP
    volumes:
        - /var/run/:/host/var/run/
        - ../crypto-config/peerOrganizations/org4.example.com/peers/peer0.org4.example.com/msp:/etc/hyperledger/fabric/msp
        - ../crypto-config/peerOrganizations/org4.example.com/peers/peer0.org4.example.com/tls:/etc/hyperledger/fabric/tls
    ports:
      - 7051:7051
      - 7052:7052
      - 7053:7053

修改crypto-config.yaml

将每個PeerOrgs的 Template和user都設為1,添加Org3和org4

  - Name: Org2
    Domain: org2.example.com
    Template:
      Count: 1
    Users:
      Count: 1

  - Name: Org3
    Domain: org3.example.com
    Template:
      Count: 1
    Users:
      Count: 1

  - Name: Org4
    Domain: org4.example.com
    Template:
      Count: 1
    Users:
      Count: 

生成公私鑰和證書

傳回e2e_cli

cd ..

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

生成的檔案都儲存到crypto-config檔案夾,我們可以進入該檔案夾檢視生成了哪些檔案

替換私鑰

cp docker-compose-e2e-template.yaml docker-compose-e2e.yaml

cd crypto-config/peerOrganizations/org1.example.com/ca/

此檔案夾下有私鑰,将其複制到docker-compose-e2e.yaml的FABRIC_CA_SERVER_TLS_KEYFILE

vim docker-compose-e2e.yaml

将每個證書  
FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/94901ee513fedeaabaa8468df8d20aa351cd6ce5f690b8944b9da44998c60cbf_sk

對于其他3個組織一樣如此。并且對此檔案證書下面的内容做修改

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

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

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

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

設定peer節點的docker-compose檔案

e2e_cli中提供了多個yaml檔案,我們可以基于docker-compose-cli.yaml檔案建立:

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

然後修改docker-compose-peer.yaml,去掉orderer的配置,隻保留一個peer和cli,因為我們要多級部署,節點與節點之前又是通過主機名通訊,是以需要修改容器中的host檔案,也就是extra_hosts設定,修改後的peer配置如下:

peer0.org1.example.com:

container_name: peer0.org1.example.com

extends:

file:  base/docker-compose-base.yaml

service: peer0.org1.example.com

extra_hosts:

- "orderer.example.com:10.11.6.118"

同樣,cli也需要能夠和各個節點通訊,是以cli下面也需要添加extra_hosts設定,去掉無效的依賴,并且去掉command這一行,因為我們是每個peer都會有個對應的用戶端,也就是cli,是以我隻需要去手動執行一次指令,而不是自動運作。修改後的cli配置如下:

cli: 
  container_name: cli 
  image: hyperledger/fabric-tools 
  tty: true 
  environment: 
 - GOPATH=/opt/gopath 
 - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock 
    - CORE_LOGGING_LEVEL=DEBUG 
 - CORE_PEER_ID=cli 
 - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 
    - CORE_PEER_LOCALMSPID=Org1MSP 
 - CORE_PEER_TLS_ENABLED=true 
    - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.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/[email protected]/msp 
  working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer 
  volumes: 
 - /var/run/:/host/var/run/ 
      - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go 
 - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ 
      - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ 
      - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts 
  depends_on: 
 - peer0.org1.example.com 
  extra_hosts: 
 - "orderer.example.com:10.11.6.118"
   - "peer0.org1.example.com:10.11.6.118"
   - "peer1.org1.example.com:10.11.6.119"
   - "peer0.org2.example.com:10.11.6.120"
   - "peer1.org2.example.com:10.11.6.121"                cli也需要能夠和各個節點通訊,是以cli下面也需要添加extra_hosts設定,去掉無效的依賴,并且去掉command這一行,因為我們是每個peer都會有個對應的用戶端,也就是cli,是以我隻需要去手動執行一次指令,而不是自動運作。修改後的cli配置如下:

cli: 
  container_name: cli 
  image: hyperledger/fabric-tools 
  tty: true 
  environment: 
 - GOPATH=/opt/gopath 
 - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock 
    - CORE_LOGGING_LEVEL=DEBUG 
 - CORE_PEER_ID=cli 
 - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 
    - CORE_PEER_LOCALMSPID=Org1MSP 
 - CORE_PEER_TLS_ENABLED=true 
    - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.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/[email protected]/msp 
  working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer 
  volumes: 
 - /var/run/:/host/var/run/ 
      - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go 
 - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ 
      - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ 
      - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts 
  depends_on: 
 - peer0.org1.example.com 
  extra_hosts: 
 - "orderer.example.com:10.11.6.118"
   - "peer0.org1.example.com:10.11.6.118"
   - "peer1.org1.example.com:10.11.6.119"
   - "peer0.org2.example.com:10.11.6.120"
   - "peer1.org2.example.com:10.11.6.121"      

設定orderer節點的docker-compose檔案

cp docker-compose-cli.yaml docker-compose-orderer.yaml                 docker-compose-cli.yaml docker-compose-orderer.yaml      

orderer伺服器上我們隻需要保留order設定,其他peer和cli設定都可以删除。orderer可以不設定extra_hosts。

生成創世區塊和Channel配置區塊

生成創世區塊

配置修改好後,我們就用configtxgen 生成創世區塊。并把這個區塊儲存到本地channel-artifacts檔案夾中:

<span style="color:#000000">configtxgen -profile FourOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block</span>

           

生成Channel配置區塊

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

另外關于錨節點的更新,我們也需要使用這個程式來生成檔案:

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

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

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

configtxgen -profile FourOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org4MSPanchors.tx -channelID mychannel -asOrg Org4MSP
                

另外關于錨節點的更新,我們也需要使用這個程式來生成檔案:

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

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

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

configtxgen -profile FourOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org4MSPanchors.tx -channelID mychannel -asOrg Org4MSP
      

分發配置檔案

我們之前的操作全在Order 伺服器上部署,我們要将此檔案夾替換掉其他3台伺服器的e2e_cli

登入各伺服器,删除原來的e2e_cli

rm -rf e2e_cli 

然後再登入到orderer伺服器上,退回到examples檔案夾,因為這樣可以友善的把其下的e2e_cli檔案夾整個傳到peer0伺服器上。

scp -r e2e_cli [email protected]:/home/fabric/go/src/github.com/hyperledger/fabric/examples/

scp -r e2e_cli [email protected]:/home/fabric/go/src/github.com/hyperledger/fabric/examples/

scp -r e2e_cli [email protected]:/home/fabric/go/src/github.com/hyperledger/fabric/examples/


我們在前面配置的就是peer0.org1.example.com上的節點,是以複制過來後不需要做任何修改。

                

然後再登入到orderer伺服器上,退回到examples檔案夾,因為這樣可以友善的把其下的e2e_cli檔案夾整個傳到peer0伺服器上。

scp -r e2e_cli [email protected]:/home/fabric/go/src/github.com/hyperledger/fabric/examples/

scp -r e2e_cli [email protected]:/home/fabric/go/src/github.com/hyperledger/fabric/examples/

scp -r e2e_cli [email protected]:/home/fabric/go/src/github.com/hyperledger/fabric/examples/


我們在前面配置的就是peer0.org1.example.com上的節點,是以複制過來後不需要做任何修改。

      

再次運作scp指令,複制到peer0.org2.example.com上,然後我們需要對docker-compose-peer.yaml做一個小小的修改,将啟動的容器改為peer0.org2.example.com,對應的cli中也改成對peer0.org2.example.com的依賴。這是修改後的peer0.org2.example.com上的配置檔案:

services:

peer0.org2.example.com:

container_name: peer0.org2.example.com

extends:

file: base/docker-compose-base.yaml

service: peer0.org2.example.com

extra_hosts:

- "orderer.example.com:10.11.6.118"

cli:

container_name: cli

image: hyperledger/fabric-tools

tty: true

environment:

- GOPATH=/opt/gopath

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

- CORE_LOGGING_LEVEL=DEBUG

- CORE_PEER_ID=cli

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

- CORE_PEER_LOCALMSPID=Org2MSP

- CORE_PEER_TLS_ENABLED=true

- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.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/[email protected]/msp

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

# command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'

volumes:

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

- ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go

- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/

- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/

- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts

depends_on:

- peer0.org2.example.com

extra_hosts:

- "orderer.example.com:10.11.6.118"

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

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

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

- "peer0.org4.example.com:10.11.6.121"

接下來繼續使用scp指令将orderer上的檔案夾傳送給peer0.org3.example.com和peer0.org4.example.com,然後也是修改一下docker-compose-peer.yaml檔案,使得其啟動對應的peer節點。

初始化Fabric環境

啟動Fabric環境的容器

我們将整個Fabric Docker環境的配置放在docker-compose-cli.yaml後,隻需要使用以下指令即可:

<span style="color:#000000">docker-compose -f docker-compose-cli.yaml up -d</span>
           

建立Channel

現在我們要進入cli容器内部,在裡面建立Channel。先用以下指令進入CLI内部Bash:

docker exec -it cli bash

建立Channel的指令是peer channel create,我們前面建立2.4建立Channel的配置區塊時,指定了Channel的名字是mychannel,那麼這裡我們必須建立同樣名字的Channel。

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 mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA

                cli容器内部,在裡面建立Channel。先用以下指令進入CLI内部Bash:

docker exec -it cli bash

建立Channel的指令是peer channel create,我們前面建立2.4建立Channel的配置區塊時,指定了Channel的名字是mychannel,那麼這裡我們必須建立同樣名字的Channel。

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 mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA

      

各個Peer加入Channel

CLI預設連接配接的是peer0.org1,那麼我們要将這個Peer加入mychannel就很簡單,隻需要運作如下指令:

peer channel join -b mychannel.block
org2 :
CORE_PEER_LOCALMSPID="Org2MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051

peer channel join -b mychannel.block
org3 :
CORE_PEER_LOCALMSPID="Org3MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org3.example.com:7051

peer channel join -b mychannel.block

org4 :
CORE_PEER_LOCALMSPID="Org4MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.example.com/peers/peer0.org4.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.example.com/users/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org4.example.com:7051

peer channel join -b mychannel.block
更新錨節點(注意$ORDERER_CA)
對于Org1來說,peer0.org1是錨節點,我們需要連接配接上它并更新錨節點:
CORE_PEER_LOCALMSPID="Org1MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org1.example.com:7051

peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA
另外對于Org2,peer0.org2是錨節點,對應的更新代碼是
ORE_PEER_LOCALMSPID="Org2MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051

peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA                預設連接配接的是peer0.org1,那麼我們要将這個Peer加入mychannel就很簡單,隻需要運作如下指令:

peer channel join -b mychannel.block
org2 :
CORE_PEER_LOCALMSPID="Org2MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051

peer channel join -b mychannel.block
org3 :
CORE_PEER_LOCALMSPID="Org3MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org3.example.com:7051

peer channel join -b mychannel.block

org4 :
CORE_PEER_LOCALMSPID="Org4MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.example.com/peers/peer0.org4.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.example.com/users/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org4.example.com:7051

peer channel join -b mychannel.block
更新錨節點(注意$ORDERER_CA)
對于Org1來說,peer0.org1是錨節點,我們需要連接配接上它并更新錨節點:
CORE_PEER_LOCALMSPID="Org1MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org1.example.com:7051

peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA
另外對于Org2,peer0.org2是錨節點,對應的更新代碼是
ORE_PEER_LOCALMSPID="Org2MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051

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

5.鍊上代碼的安裝與運作

5.1Install ChainCode安裝鍊上代碼

鍊上代碼的安裝需要在各個相關的Peer上進行,對于我們現在這種Fabric網絡,如果4個Peer都想對Example02進行操作,那麼就需要安裝4次。

仍然是保持在CLI的指令行下,我們先切換到peer0.org1這個節點:

CORE_PEER_LOCALMSPID="Org1MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
使用peer chaincode install指令可以安裝指定的ChainCode并對其命名:
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02                "Org1MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
使用peer chaincode install指令可以安裝指定的ChainCode并對其命名:
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02      

5.2Instantiate ChainCode執行個體化鍊上代碼

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 chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member','Org3MSP.member','Org4MSP.member')"


                cert.pem

peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member','Org3MSP.member','Org4MSP.member')"


      

在一個Peer上查詢并發起交易

前面的操作都是在org1下面做的,那麼處于同一個區塊鍊(同一個Channel下)的org2,是否會看org1的更改呢?我們試着給peer0.org2安裝鍊上代碼:
CORE_PEER_LOCALMSPID="Org2MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051

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

由于mycc已經在前面org1的時候執行個體化了,也就是說對應的區塊已經生成了,是以在org2不能再次初始化。我們直接運作查詢指令:

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




ERROR
1、BAD_RESQUEST  嘗試重新開機容器,或許系統中存在殘留的錯誤鏡像。docker image 查詢一下                
CORE_PEER_LOCALMSPID="Org2MSP" 
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/[email protected]/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051

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

由于mycc已經在前面org1的時候執行個體化了,也就是說對應的區塊已經生成了,是以在org2不能再次初始化。我們直接運作查詢指令:

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




ERROR
1、BAD_RESQUEST  嘗試重新開機容器,或許系統中存在殘留的錯誤鏡像。docker image 查詢一下      

參考:

https://www.cnblogs.com/studyzy/p/7237287.html 

https://www.cnblogs.com/studyzy/p/7437157.html

繼續閱讀