前言
在 Hyperledger Fabric 组织的动静增加和删除中,咱们曾经实现了在运行着的网络中动静增加和删除组织,但目前为止,咱们启动 orderer 节点的形式都是通过零碎通道的形式,这样自带零碎通道的网络很不简洁优雅。好在 Fabric 2.3 以上就开始反对无零碎通道创立利用通道的性能,本文将对此性能进行具体解释和介绍,而后通过无零碎通道的形式启动联盟链网络并在此基础上实现通道的增加和删除。本试验必要的筹备工作和 DNS 配置请参考 筹备工作。
背景介绍
试验筹备
本文网络结构间接将 Hyperledger Fabric 定制联盟链网络工程实际 中创立的 1_3Org2Peer1Orderer1TLS
复制为 3_RunWithNoSystemChannel
(倡议间接将本案例仓库 FabricLearn 下的 3_RunWithNoSystemChannel
目录拷贝到本地运行)。默认状况下,所有命令皆在 3_RunWithNoSystemChannel
根目录下执行,在开始前面的试验前依照以下命令启动根底试验网络:
- 设置环境变量
source envpeer1soft
- 启动 CA 网络
./0_Restart.sh
- 注册用户
./1_RegisterUser.sh
- 结构证书
./2_EnrollUser.sh
本试验初始 docker 网络为:
本文工作
以无零碎通道的形式启动 Hyperledger Fabric 网络,而后先用 configtxgen
工具创立新通道 mychannel
和 testchannel
,并应用 osnadmin
工具通过 orderer
的 admin
服务使 orderer
退出这两条通道(试验代码已上传至:https://github.com/wefantasy/FabricLearn 的 3_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 成员节点 |
无零碎通道启动
-
批改
compose/docker-base.yaml
中orderer-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
独立,能够抉择其余的证书。
-
批改
compose/docker-compose.yaml
中orderer-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
相比源文件,次要增加了
ADMIN
、ORDERER_OPERATIONS_LISTENADDRESS
的端口监听。 -
在
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
-
无零碎通道启动
orderer
和peer
节点:docker-compose -f $LOCAL_ROOT_PATH/compose/docker-compose.yaml up -d peer1.soft.ifantasy.net peer1.web.ifantasy.net orderer1.orderer.ifantasy.net
无零碎通道启动胜利后的容器环境:
新建通道
新建通道文件
接下来咱们将创立两个通道,它们别离是 mychannel
和 testchannel
:
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
这里的参数 ORDERER_CA
、ORDERER_ADMIN_TLS_SIGN_CERT
、ORDERER_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"
这里 --config-block
指向的文件必须为 block
文件,否则可能会呈现谬误:
osnadmin: error: parsing arguments: failed to retrieve channel id - block is empty. Try --help
所有工作实现后,能够再次应用 osnadmin channel list
命令查看已退出的通道:
节点退出通道
节点退出通道只须要能拜访通道对应的 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 组织的 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
装置链码到指定通道
当初咱们的网络中有 soft 和 web 两个组织,每个组织有个 peer1
节点,每个节点都退出了 mychannel
和 testchannel
两个通道,如果想将链码装置到 testchannel
通道,只须要按以下流程:
-
两个组织别离装置链码:
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 节点。
-
两个组织别离批准链码:
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
通道上,只须要在批准链码时指定--channelID
为testchannel
即可。此时已能够在testchannel
上查看到链码批准状况: -
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"]}'
-
初始化并调用链码:
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 联盟链通常对删除操作并没有提供反对。
参考
- yuan1028. fabric 2.3 零碎通道. 简书. [2021-01-21] ↩
- JACOB WILSON. How do you delete a channel on Hyperledger fabric?. it-qa.com. [2019-04-05] ↩