前言
在Hyperledger Fabric組織的動態新增和刪除中,我們已經完成了在執行著的網路中動態新增和刪除組織。本文將在其基礎上,詳細介紹瞭如何在 soft 組織上新增新的 peer2 節點,並在簡要概述了刪除節點的方法,本實驗必要的準備工作和 DNS 配置請參考 準備工作。
背景介紹
實驗準備
本文網路結構直接使用 Hyperledger Fabric組織的新增和刪除 中建立的2_FabricNetworkUpdate
(建議直接將本案例倉庫 FabricLearn 下的 2_FabricNetworkUpdate
目錄拷貝到本地執行)。預設情況下,所有命令皆在 2_FabricNetworkUpdate
根目錄下執行,在開始後面的實驗前按照以下命令啟動基礎實驗網路:
- 設定環境變數
source envpeer1soft
- 啟動CA網路
./0_Restart.sh
- 註冊使用者
./1_RegisterUser.sh
- 構造證書
./2_EnrollUser.sh
- 配置通道
./3_Configtxgen.sh
- 安裝測試鏈碼
./4_TestChaincode.sh
本實驗初始 docker 網路為:
本實驗初始區塊高度為6:
本文工作
向 Hyperledger Fabric 網路中的 soft 組織動態新增一個節點 peer2 ,網路結構為(實驗程式碼已上傳至:https://github.com/wefantasy/FabricLearn 的 2_FabricNetworkUpdate/7_AddPeer.sh
下)[1]:
項 | 執行埠 | 說明 |
---|---|---|
council.ifantasy.net |
7050 | council 組織的 CA 服務, 為聯盟鏈網路提供 TLS-CA 服務 |
orderer.ifantasy.net |
7150 | orderer 組織的 CA 服務, 為聯盟鏈網路提供排序服務 |
orderer1.orderer.ifantasy.net |
7151 | orderer 組織的 orderer1 成員節點 |
soft.ifantasy.net |
7250 | soft 組織的 CA 服務, 包含成員: peer1 、 admin1 |
peer1.soft.ifantasy.net |
7251 | soft 組織的 peer1 成員節點 |
peer2.soft.ifantasy.net |
7252 | soft 組織的 peer2 成員節點 |
web.ifantasy.net |
7350 | web 組織的 CA 服務, 包含成員: peer1 、 admin1 |
peer1.web.ifantasy.net |
7351 | web 組織的 peer1 成員節點 |
新增新節點
生成peer2的組織證書
由於 peer2 屬於 soft 組織,所以其證書直接使用已有的 CA 伺服器即可生成。
- 生成 TLS-CA 證書:
export FABRIC_CA_CLIENT_TLS_CERTFILES=$LOCAL_CA_PATH/council.ifantasy.net/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=$LOCAL_CA_PATH/council.ifantasy.net/ca/admin
fabric-ca-client register -d --id.name peer2soft --id.secret peer2soft --id.type peer -u https://council.ifantasy.net:7050
- 生成 CA 證書:
export FABRIC_CA_CLIENT_TLS_CERTFILES=$LOCAL_CA_PATH/soft.ifantasy.net/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=$LOCAL_CA_PATH/soft.ifantasy.net/ca/admin
fabric-ca-client register -d --id.name peer2 --id.secret peer2 --id.type peer -u https://soft.ifantasy.net:7250
- 構造證書目錄:
echo "Enroll Peer2"
export FABRIC_CA_CLIENT_HOME=$LOCAL_CA_PATH/soft.ifantasy.net/registers/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=$LOCAL_CA_PATH/soft.ifantasy.net/assets/ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://peer2:peer2@soft.ifantasy.net:7250
# for TLS
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=$LOCAL_CA_PATH/soft.ifantasy.net/assets/tls-ca-cert.pem
fabric-ca-client enroll -d -u https://peer2soft:peer2soft@council.ifantasy.net:7050 --enrollment.profile tls --csr.hosts peer2.soft.ifantasy.net
cp $LOCAL_CA_PATH/soft.ifantasy.net/registers/peer2/tls-msp/keystore/*_sk $LOCAL_CA_PATH/soft.ifantasy.net/registers/peer2/tls-msp/keystore/key.pem
mkdir -p $LOCAL_CA_PATH/soft.ifantasy.net/registers/peer2/msp/admincerts
cp $LOCAL_CA_PATH/soft.ifantasy.net/registers/admin1/msp/signcerts/cert.pem $LOCAL_CA_PATH/soft.ifantasy.net/registers/peer2/msp/admincerts/cert.pem
配置peer2的容器及環境變數
- 在
compose
目錄下新建update-peer.yaml
檔案,內容如下:
version: '2'
networks:
network:
services:
peer2.soft.ifantasy.net:
container_name: peer2.soft.ifantasy.net
extends:
file: docker-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer2.soft.ifantasy.net
- CORE_PEER_ADDRESS=peer2.soft.ifantasy.net:7051
- CORE_PEER_LOCALMSPID=softMSP
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2.soft.ifantasy.net:7051
volumes:
- ${LOCAL_CA_PATH}/soft.ifantasy.net/registers/peer2:${DOCKER_CA_PATH}/peer
ports:
- 7252:7051
- 啟動 peer2 容器:
docker-compose -f $LOCAL_ROOT_PATH/compose/update-peer.yaml up -d peer2.soft.ifantasy.net
此時可以使用 docker ps
命令看到 peer2 容器成功執行:
3. 新增 peer2 的 DNS 解析記錄到本機:
echo "127.0.0.1 peer2.soft.ifantasy.net" >> /etc/hosts
- 將 peer1 的環境變數檔案
envpeer1soft
複製一份到envpeer2soft
,其內容為:
export LOCAL_ROOT_PATH=$PWD
export LOCAL_CA_PATH=$LOCAL_ROOT_PATH/orgs
export DOCKER_CA_PATH=/tmp
export COMPOSE_PROJECT_NAME=fabriclearn
export DOCKER_NETWORKS=network
export FABRIC_BASE_VERSION=2.4
export FABRIC_CA_VERSION=1.5
echo "init terminal soft"
export FABRIC_CFG_PATH=$LOCAL_ROOT_PATH/config
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="softMSP"
export CORE_PEER_ADDRESS=peer2.soft.ifantasy.net:7252
export CORE_PEER_TLS_ROOTCERT_FILE=$LOCAL_CA_PATH/soft.ifantasy.net/assets/tls-ca-cert.pem
export CORE_PEER_MSPCONFIGPATH=$LOCAL_CA_PATH/soft.ifantasy.net/registers/admin1/msp
export ORDERER_CA=$LOCAL_CA_PATH/orderer.ifantasy.net/registers/orderer1/tls-msp/tlscacerts/tls-council-ifantasy-net-7050.pem
peer2加入通道
- 拉取通道創世區塊:
peer channel fetch 0 mychannel.block -o orderer1.orderer.ifantasy.net:7151 -c mychannel --tls --cafile $ORDERER_CA
由於 peer2 還沒有 mychannel 通道的訪問許可權,所以目前為止我們都是使用 peer1 的環境變數進行操作,後面加入通道後可以使用 peer2 的環境變數。
- peer2 加入通道:
source envpeer2soft
peer channel fetch 0 mychannel.block -o orderer1.orderer.ifantasy.net:7151 -c mychannel --tls --cafile $ORDERER_CA
此時 peer2 已經加入通道,但是其區塊高度仍為0:
- peer2 安裝鏈碼:
peer lifecycle chaincode install basic.tar.gz
現在 peer2 的區塊高度已更新到最新的6:
刪除舊節點
或許是刪除舊節點不符合區塊鏈的設計思想,因此官方並沒有提供方法來移除已經加入通道的 peer 節點,但是在實際使用中,我們可以直接通過停用 peer 容器來移除 peer 節點[2]。
參考
zcc0721. Fabric向現有組織中新增新節點. 2021-01-14. [CSDN] ↩︎
Alessandro Sorniotti. How to remove peer from a channel. 2018-11-14. [CSDN] ↩︎