• Hyperledger Fabric无系统通道启动及通道的创建和删除


    前言

    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] ↩︎


    __EOF__

  • 本文作者: 风色幻想
  • 本文链接: https://www.cnblogs.com/ifantasy/p/16129581.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Qt Quick 用cmake怎么玩子项目
    Autofac 注入仓储模式
    VSCode官方历史版本下载
    哈夫曼树哈夫曼编码知识点
    每日4道算法题——第005天
    nginx测试rewrite
    Java中数组array和列表list相互转换
    腾讯云数据库公有云市场稳居TOP 2!
    神奇的python的生成器
    LintCode 3209: Moving fruit 堆典型题
  • 原文地址:https://www.cnblogs.com/ifantasy/p/16129581.html