Hyperledger Fabric無系統通道啟動及通道的建立和刪除

丿風色幻想發表於2022-04-11

前言

Hyperledger Fabric組織的動態新增和刪除中,我們已經完成了在執行著的網路中動態新增和刪除組織,但目前為止,我們啟動 orderer 節點的方式都是通過系統通道的方式,這樣自帶系統通道的網路很不簡潔優雅。好在 Fabric 2.3 以上就開始支援無系統通道建立應用通道的功能,本文將對此功能進行詳細解釋和介紹,然後通過無系統通道的方式啟動聯盟鏈網路並在此基礎上完成通道的新增和刪除。本實驗必要的準備工作和 DNS 配置請參考 準備工作

背景介紹

實驗準備

本文網路結構直接將 Hyperledger Fabric定製聯盟鏈網路工程實踐 中建立的 1_3Org2Peer1Orderer1TLS 複製為 3_RunWithNoSystemChannel (建議直接將本案例倉庫 FabricLearn 下的 3_RunWithNoSystemChannel 目錄拷貝到本地執行)。預設情況下,所有命令皆在 3_RunWithNoSystemChannel 根目錄下執行,在開始後面的實驗前按照以下命令啟動基礎實驗網路:

  1. 設定環境變數 source envpeer1soft
  2. 啟動CA網路 ./0_Restart.sh
  3. 註冊使用者 ./1_RegisterUser.sh
  4. 構造證書 ./2_EnrollUser.sh

本實驗初始 docker 網路為:
初始 docker 網路

本文工作

以無系統通道的方式啟動 Hyperledger Fabric 網路,然後先用 configtxgen 工具建立新通道 mychanneltestchannel ,並使用 osnadmin 工具通過 ordereradmin 服務使 orderer 加入這兩條通道(實驗程式碼已上傳至:https://github.com/wefantasy/FabricLearn3_RunWithNoSystemChannel 下)[1]

執行埠 說明
council.ifantasy.net 7050 council 組織的 CA 服務, 為聯盟鏈網路提供 TLS-CA 服務
orderer.ifantasy.net 7150 orderer 組織的 CA 服務, 為聯盟鏈網路提供排序服務
orderer1.orderer.ifantasy.net 7151 orderer 組織的排序服務
orderer1.orderer.ifantasy.net 7152 orderer 組織的 ADMIN 服務
soft.ifantasy.net 7250 soft 組織的 CA 服務, 包含成員: peer1 、 admin1
peer1.soft.ifantasy.net 7251 soft 組織的 peer1 成員節點
web.ifantasy.net 7350 web 組織的 CA 服務, 包含成員: peer1 、 admin1
peer1.web.ifantasy.net 7351 web 組織的 peer1 成員節點

無系統通道啟動

  1. 修改 compose/docker-base.yamlorderer-base 內容為:
  orderer-base:
    image: hyperledger/fabric-orderer:${FABRIC_BASE_VERSION}
    environment:
      - ORDERER_HOME=${DOCKER_CA_PATH}/orderer
      - ORDERER_GENERAL_LISTENPORT=7777
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_BOOTSTRAPMETHOD=none
      - ORDERER_CHANNELPARTICIPATION_ENABLED=true
      # - ORDERER_GENERAL_GENESISMETHOD=file
      # - ORDERER_GENERAL_GENESISFILE=${DOCKER_CA_PATH}/orderer/genesis.block
      - ORDERER_GENERAL_LOCALMSPDIR=${DOCKER_CA_PATH}/orderer/msp
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_CERTIFICATE=${DOCKER_CA_PATH}/orderer/tls-msp/signcerts/cert.pem
      - ORDERER_GENERAL_TLS_PRIVATEKEY=${DOCKER_CA_PATH}/orderer/tls-msp/keystore/key.pem
      - ORDERER_GENERAL_TLS_ROOTCAS=[${DOCKER_CA_PATH}/orderer/tls-msp/tlscacerts/tls-council-ifantasy-net-7050.pem]
      - ORDERER_ADMIN_TLS_ENABLED=true
      - ORDERER_ADMIN_TLS_CERTIFICATE=${DOCKER_CA_PATH}/orderer/tls-msp/signcerts/cert.pem
      - ORDERER_ADMIN_TLS_PRIVATEKEY=${DOCKER_CA_PATH}/orderer/tls-msp/keystore/key.pem
      - ORDERER_ADMIN_TLS_ROOTCAS=[${DOCKER_CA_PATH}/orderer/tls-msp/tlscacerts/tls-council-ifantasy-net-7050.pem]
      - ORDERER_ADMIN_TLS_CLIENTROOTCAS=[${DOCKER_CA_PATH}/orderer/tls-msp/tlscacerts/tls-council-ifantasy-net-7050.pem]
      - ORDERER_ADMIN_LISTENADDRESS=0.0.0.0:8888
      - ORDERER_METRICS_PROVIDER=prometheus
      - ORDERER_OPERATIONS_LISTENADDRESS=0.0.0.0:9999
      - ORDERER_DEBUG_BROADCASTTRACEDIR=data/logs
    networks:
      - ${DOCKER_NETWORKS}

相比原始檔主要修改如下:

  • ORDERER_GENERAL_GENESISMETHOD :將啟動方式改為 none
  • ORDERER_CHANNELPARTICIPATION_ENABLED :無系統通道啟動,該欄位必須設定為 true
  • 新增 ORDERER_ADMIN_TLS_* 相關設定, 後續排序節點使用 osnadmin 加入通道依賴於配置, 它的服務和證書與 ORDERER 獨立,可以選擇其他的證書。
  1. 修改 compose/docker-compose.yamlorderer-base 內容為:
  orderer1.orderer.ifantasy.net:
    container_name: orderer1.orderer.ifantasy.net
    extends:
      file: docker-base.yaml
      service: orderer-base
    environment:
      - ORDERER_HOST=orderer1.orderer.ifantasy.net
      - ORDERER_GENERAL_LOCALMSPID=ordererMSP
    volumes:
      - ${LOCAL_CA_PATH}/orderer.ifantasy.net/registers/orderer1:${DOCKER_CA_PATH}/orderer
      # - ${LOCAL_ROOT_PATH}/data/genesis.block:${DOCKER_CA_PATH}/orderer/genesis.block
    ports:
      - 7151:7777
      - 7152:8888
      - 7153:9999

相比原始檔,主要新增了 ADMINORDERER_OPERATIONS_LISTENADDRESS 的埠監聽。

  1. envpeer1soft 中新增 ORDERER ADMIN 的環境變數:
export ORDERER_CA=$LOCAL_CA_PATH/orderer.ifantasy.net/registers/orderer1/tls-msp/tlscacerts/tls-council-ifantasy-net-7050.pem
export ORDERER_ADMIN_TLS_SIGN_CERT=$LOCAL_CA_PATH/orderer.ifantasy.net/registers/orderer1/tls-msp/signcerts/cert.pem
export ORDERER_ADMIN_TLS_PRIVATE_KEY=$LOCAL_CA_PATH/orderer.ifantasy.net/registers/orderer1/tls-msp/keystore/key.pem
  1. 無系統通道啟動 ordererpeer 節點:
docker-compose -f $LOCAL_ROOT_PATH/compose/docker-compose.yaml up -d peer1.soft.ifantasy.net peer1.web.ifantasy.net orderer1.orderer.ifantasy.net

無系統通道啟動成功後的容器環境:
啟動成功後的容器環境:

新建通道

新建通道檔案

接下來我們將建立兩個通道,它們分別是 mychanneltestchannel

configtxgen -profile OrgsChannel -outputCreateChannelTx $LOCAL_ROOT_PATH/data/mychannel.tx -channelID mychannel
configtxgen -profile OrgsChannel -outputBlock $LOCAL_ROOT_PATH/data/mychannel.block -channelID mychannel
configtxgen -profile OrgsChannel -outputCreateChannelTx $LOCAL_ROOT_PATH/data/testchannel.tx -channelID testchannel
configtxgen -profile OrgsChannel -outputBlock $LOCAL_ROOT_PATH/data/testchannel.block -channelID testchannel

在上面我們同時使用了 -outputCreateChannelTx-outputBlock 引數建立了兩個通道的 tx 檔案和 block 檔案,其中 block 檔案為加入通道時所使用的創世區塊檔案,可以由對應的 tx 檔案計算而來。

排序節點加入通道

在排序節點加入通道前,我們可以使用以下命令檢視當前的通道:

source envpeer1soft
osnadmin channel list -o orderer1.orderer.ifantasy.net:7152 --ca-file $ORDERER_CA --client-cert $ORDERER_ADMIN_TLS_SIGN_CERT --client-key $ORDERER_ADMIN_TLS_PRIVATE_KEY

osnadmin channel list 1

這裡的引數 ORDERER_CAORDERER_ADMIN_TLS_SIGN_CERTORDERER_ADMIN_TLS_PRIVATE_KEY 必須與上面 compose/docker-base.yaml 中的 ORDERER_ADMIN_TLS_* 相關證書檔案一致。埠必須與 ORDERER_ADMIN_LISTENADDRESS 一致,否則可能會出現以下錯誤:

error: Get "https://orderer1.orderer.ifantasy.net:7151/participation/v1/channels": net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x05\x00\x00@\x00"

如果沒有報錯,可以使用 osnadmin channel join 根據創世區塊加入通道:

osnadmin channel join --channelID mychannel --config-block $LOCAL_ROOT_PATH/data/mychannel.block -o orderer1.orderer.ifantasy.net:7152 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY"
osnadmin channel join --channelID testchannel --config-block $LOCAL_ROOT_PATH/data/testchannel.block -o orderer1.orderer.ifantasy.net:7152 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY"

osnadmin channel join

這裡 --config-block 指向的檔案必須為 block 檔案,否則可能會出現錯誤:

osnadmin: error: parsing arguments: failed to retrieve channel id - block is empty. Try --help

所有工作完成後,可以再次使用 osnadmin channel list 命令檢視已加入的通道:
osnadmin channel list 2

節點加入通道

節點加入通道只需要能訪問通道對應的 block 創世區塊檔案即可,為了方便管理,我們先將創世區塊複製到各組織的公共資產目錄下:

cp $LOCAL_ROOT_PATH/data/mychannel.block $LOCAL_CA_PATH/soft.ifantasy.net/assets/
cp $LOCAL_ROOT_PATH/data/mychannel.block $LOCAL_CA_PATH/web.ifantasy.net/assets/
cp $LOCAL_ROOT_PATH/data/testchannel.block $LOCAL_CA_PATH/soft.ifantasy.net/assets/
cp $LOCAL_ROOT_PATH/data/testchannel.block $LOCAL_CA_PATH/web.ifantasy.net/assets/

現在使 soft 組織的 peer 節點加入建立的兩個通道:

source envpeer1soft
peer channel join -b $LOCAL_CA_PATH/soft.ifantasy.net/assets/mychannel.block
peer channel join -b $LOCAL_CA_PATH/soft.ifantasy.net/assets/testchannel.block
peer channel list

soft 加入通道

然後使 soft 組織的 peer 節點加入建立的兩個通道:

source envpeer1web
peer channel join -b $LOCAL_CA_PATH/web.ifantasy.net/assets/mychannel.block
peer channel join -b $LOCAL_CA_PATH/web.ifantasy.net/assets/testchannel.block
peer channel list

web 加入通道

安裝鏈碼到指定通道

現在我們的網路中有 soft 和 web 兩個組織,每個組織有個 peer1 節點,每個節點都加入了 mychanneltestchannel 兩個通道,如果想將鏈碼安裝到 testchannel 通道,只需要按以下流程:

  1. 兩個組織分別安裝鏈碼:
source envpeer1soft
# peer lifecycle chaincode package basic.tar.gz --path asset-transfer-basic/chaincode-go --label basic_1
peer lifecycle chaincode install basic.tar.gz
peer lifecycle chaincode queryinstalled
source envpeer1web
peer lifecycle chaincode install basic.tar.gz
peer lifecycle chaincode queryinstalled

export CHAINCODE_ID=basic_1:06613e463ef6694805dd896ca79634a2de36fdf019fa7976467e6e632104d718

安裝鏈碼

由於本專案是從 Hyperledger Fabric定製聯盟鏈網路工程實踐 中複製而來,所以這裡直接安裝該實驗中打包過的鏈碼 basic.tar.gz ,並且設定 CHAINCODE_ID 為鏈碼安裝後的 ID 。在安裝時不必指定具體通道,因為安裝行為是針對節點而非通道,即 將節點安裝到 peer 節點。

  1. 兩個組織分別批准鏈碼:
source envpeer1soft
peer lifecycle chaincode approveformyorg -o orderer1.orderer.ifantasy.net:7151 --tls --cafile $ORDERER_CA  --channelID testchannel --name basic --version 1.0 --sequence 1 --waitForEvent --init-required --package-id $CHAINCODE_ID
peer lifecycle chaincode queryapproved -C testchannel -n basic --sequence 1
source envpeer1web
peer lifecycle chaincode approveformyorg -o orderer1.orderer.ifantasy.net:7151 --tls --cafile $ORDERER_CA  --channelID testchannel --name basic --version 1.0 --sequence 1 --waitForEvent --init-required --package-id $CHAINCODE_ID
peer lifecycle chaincode queryapproved -C testchannel -n basic --sequence 1

若想將鏈碼安裝到 testchannel 通道上,只需要在批准鏈碼時指定 --channelIDtestchannel 即可。此時已可以在 testchannel 上檢視到鏈碼批准情況:
批准鏈碼

  1. web 組織提交鏈碼:
source envpeer1web
peer lifecycle chaincode commit -o orderer1.orderer.ifantasy.net:7151 --tls --cafile $ORDERER_CA --channelID testchannel --name basic --init-required --version 1.0 --sequence 1 --peerAddresses peer1.soft.ifantasy.net:7251 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE --peerAddresses peer1.web.ifantasy.net:7351 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE
peer chaincode invoke --isInit -o orderer1.orderer.ifantasy.net:7151 --tls --cafile $ORDERER_CA --channelID testchannel --name basic --peerAddresses peer1.soft.ifantasy.net:7251 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE --peerAddresses peer1.web.ifantasy.net:7351 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE -c '{"Args":["InitLedger"]}'

提交鏈碼
4. 初始化並呼叫鏈碼:

peer chaincode invoke --isInit -o orderer1.orderer.ifantasy.net:7151 --tls --cafile $ORDERER_CA --channelID testchannel --name basic --peerAddresses peer1.soft.ifantasy.net:7251 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE --peerAddresses peer1.web.ifantasy.net:7351 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE -c '{"Args":["InitLedger"]}'
sleep 5
peer chaincode invoke -o orderer1.orderer.ifantasy.net:7151 --tls --cafile $ORDERER_CA --channelID testchannel --name basic --peerAddresses peer1.soft.ifantasy.net:7251 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE --peerAddresses peer1.web.ifantasy.net:7351 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE -c '{"Args":["GetAllAssets"]}'

初始化並呼叫鏈碼

刪除通道

區塊鏈的不可篡改性註定了我們無法從網路上刪除通道,只能將新資料(正常事務或配置更新)附加到區塊鏈網路[2]。到現在我們已經討論過了組織、節點及通道的新增和刪除方式,發現 Fabric 聯盟鏈通常對刪除操作並沒有提供支援。

參考


  1. yuan1028. fabric 2.3系統通道. 簡書. [2021-01-21] ↩︎

  2. JACOB WILSON. How do you delete a channel on Hyperledger fabric?. it-qa.com. [2019-04-05] ↩︎

相關文章