1. 程式人生 > >HyperLedger(3)多主機部署Fabric1.0

HyperLedger(3)多主機部署Fabric1.0

多主機部署Fabric1.0

  1. 本文以fabric下examples/e2e_cli為例,並使用docker-compose-e2e.yaml來啟動Fabric網路。
  2. 在三臺主機上進行部署,分別orderer service、org1(包括2個peer,1個ca)、org2(包括2個peer,1個ca)。

準備工作

  1. 執行Fabric節點需要依賴以下工具:

    1. Docker: 用於管理Fabric映象以及執行peer和orderer等元件。
    2. Docker-compose:用於配置Fabric容器
    3. Fabric原始碼:提供了用於生成證書(cryptogen)和配置channel(configtxgen)的工具和e2e_cli示例。
    4. Go語言開發環境:原始碼的工具編譯依賴於Go語言。
  2. 在主機1利用cryptogen和configtxgen工具生成證書和配置channel等相關檔案

    命令分別如下:

    
    #生成證書
    
    cryptogen generate --config=./crypto-config.yaml
    
    #生成配置channel所需檔案
    
    configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
    
    configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx
    -channelID mychannel configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
  3. 將步驟2生成的檔案拷貝到主機2和主機3保持所有主機的這些檔案相同。

主機1(orderer service)

IP:10.168.195.108

​ 編輯docker-compose-e2e.yaml檔案,只保留services下的orderer.example.com ,其它services註釋掉。內容如下所示:

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

注意: 在部署org1和org2的主機上編輯/etc/hosts,並在檔案末尾新增如下內容

10.168.195.98 orderer.example.com (按照自己實際情況)

主機2(org1:包括2個peer、1個ca)

  1. 編輯docker-compose-e2e.yaml檔案,只保留services下的ca0、peer0.org1.example.com、peer1.org1.example.com,其它services註釋掉。

  2. 給peer0.org1和peer1.org1新增如下內容:

    extra_hosts:
        - "orderer.example.com:10.168.195.108"
  3. 編輯cli,修改如下內容:

    
    #將command註釋掉
    
       command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
    
    
    #在volumes新增
    
    - ./peer:/opt/gopath/src/github.com/hyperledger/fabric/peer/
    - /etc/hosts:/etc/hosts
  4. 編輯base/peer-base.yaml檔案,新增如下內容:

    volumes:
         - /etc/hosts:/etc/hosts

主機3(org2:包括2個peer、1個ca)

  1. 編輯docker-compose-e2e.yaml檔案,只保留services下的ca1、peer0.org2.example.com、peer1.org2.example.com,其它services註釋掉。

  2. 給peer0.org1和peer1.org1新增如下內容:

    extra_hosts:
        - "orderer.example.com:10.168.195.108"
  3. 編輯cli,修改如下內容:

    
    #將command註釋掉
    
       command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
    
    
    #在volumes新增
    
         - ./peer:/opt/gopath/src/github.com/hyperledger/fabric/peer/
         - /etc/hosts:/etc/hosts
    
    
    #修改environment內容
    
    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/Admin@org2.example.com/msp
    
  4. 編輯base/peer-base.yaml檔案,新增如下內容:

    volumes:
         - /etc/hosts:/etc/hosts

測試

啟動Fabric網路

  1. 先啟動主機1上上的orderer service

    sudo docker-compose -f docker-compose-e2e.yaml up
  2. 分別在主機2、主機3上啟動org1、org2的peer

    sudo docker-compose -f docker-compose-e2e.yaml up

Channel

  1. 在主機2上進入cli容器

    sudo docker exec -it cli bash
  2. 建立channel

    peer channel create -o orderer.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/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

    e2e_cli/peer目錄下生成一個名為mychannel.block檔案,將它拷貝到主機3的e2e_cli/peer目錄下。

  3. 加入channel

    
    #在主機2、3上的cli容器內分別執行如下命令
    
    peer channel join -b mychannel.block
  4. 更新背書節點資訊

    
    #在主機2上執行
    
    peer channel update -o orderer.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/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    
    #在主機3上執行
    
    peer channel update -o orderer.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/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

Chaincode

  1. Install

    
    #主機2、3上都需要執行該命令
    
    peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
  2. Instantiate

    
    #該命令只需要在一個節點上例項化即可。該示例我們在主機2上進行。
    
    peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
  3. Query

    
    #此時在主機23上分別查詢a的值都為100.
    
    peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
  4. Invoke

    
    #在主機2上進行轉賬操作。a轉給b10.
    
    peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'
  5. Query

    再次執行步驟3的Query操作,此時a為90,b為210.