乐趣区

关于区块链:Hyperledger-Fabric组织的动态添加和删除

前言

在 Fabric 定制联盟链网络工程实际中,咱们虚构了一个工作室的联盟链网络需要,并依据此需要剖析了整个网络的架构且曾经实现了一个简略 fabric 网络模型。本文将在其根底上,在 mychannel 通道上增加新的 hard 组织,并在之后删除 soft 组织,本试验必要的筹备工作和 DNS 配置请参考 筹备工作。

背景介绍

试验筹备

本节网络架构基于 Fabric 定制联盟链网络工程实际,将我的项目中 1_3Org2Peer1Orderer1TLS 复制为 2_FabricNetworkUpdate 并进入目录(倡议间接将本案例仓库 FabricLearn 下的 2_FabricNetworkUpdate 目录拷贝到本地运行),本文默认状况下,所有命令皆在 2_FabricNetworkUpdate 根目录下执行。依照以下命令启动根底网络:

  1. 设置环境变量 source envpeer1soft
  2. 启动 CA 网络 ./0_Restart.sh
  3. 注册用户 ./1_RegisterUser.sh
  4. 结构证书 ./2_EnrollUser.sh
  5. 配置通道 ./3_Configtxgen.sh
  6. 装置测试链码 ./4_TestChaincode.sh

本试验初始 docker 网络为:

本试验初始区块高度为 6:

本文工作

本试验中向 Hyperledger Fabric 网络动静增加一个新组织 hard,其蕴含一个组织节点 peer1,网络结构为(试验代码已上传至:https://github.com/wefantasy/FabricLearn 的 2_FabricNetworkUpdate 下)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 成员节点
web.ifantasy.net 7350 web 组织的 CA 服务,蕴含成员:peer1、admin1
peer1.web.ifantasy.net 7351 web 组织的 peer1 成员节点
hard.ifantasy.net 7450 hard 组织的 CA 服务,蕴含成员:peer1、admin1
peer1.hard.ifantasy.net 7451 hard 组织的 peer1 成员节点

增加新组织

本节将演示在根底网络中增加一个新组织——hard(硬件组)1

生成 hard 组织证书

在测试中咱们能够简略的通过 cryptogen 来创立 hard 组织的所有证书,其具体方法不在赘述,本文将仍应用 fabric-ca 的模式创立 hard 组织所有证书。

  1. compose/docker-compose.yaml 中增加 hard 的 CA 服务:

    hard.ifantasy.net:
     container_name: hard.ifantasy.net
     extends:
         file: docker-base.yaml
         service: ca-base
     command: sh -c 'fabric-ca-server start -d -b ca-admin:ca-adminpw --port 7050'
     environment:
         - FABRIC_CA_SERVER_CSR_CN=hard.ifantasy.net
         - FABRIC_CA_SERVER_CSR_HOSTS=hard.ifantasy.net
     volumes:
         - ${LOCAL_CA_PATH}/hard.ifantasy.net/ca:${DOCKER_CA_PATH}/ca
     ports:
         - 7450:7050
  2. 启动 hard 的 CA 服务

    docker-compose -f $LOCAL_ROOT_PATH/compose/docker-compose.yaml up -d hard.ifantasy.net
  3. 注册 hard 的组织账号:

    echo "Working on tls"
    export FABRIC_CA_CLIENT_TLS_CERTFILES=$LOCAL_CA_PATH//ca/crypto/ca-cert.pem
    export FABRIC_CA_CLIENT_HOME=$LOCAL_CA_PATH//ca/admin
    fabric-ca-client enroll -d -u https://ca-admin:ca-adminpw@:7050
    fabric-ca-client register -d --id.name peer1hard --id.secret peer1hard --id.type orderer -u https://:7050
    
    echo "Working on hard"
    export FABRIC_CA_CLIENT_TLS_CERTFILES=$LOCAL_CA_PATH/hard.ifantasy.net/ca/crypto/ca-cert.pem
    export FABRIC_CA_CLIENT_HOME=$LOCAL_CA_PATH/hard.ifantasy.net/ca/admin
    fabric-ca-client enroll -d -u https://ca-admin:ca-adminpw@hard.ifantasy.net:7450
    fabric-ca-client register -d --id.name peer1 --id.secret peer1 --id.type peer -u https://hard.ifantasy.net:7450
    fabric-ca-client register -d --id.name admin1 --id.secret admin1 --id.type admin -u https://hard.ifantasy.net:7450
  4. 配置 hard 的组织证书:

    echo "Preparation============================="
    mkdir -p $LOCAL_CA_PATH/hard.ifantasy.net/assets
    cp $LOCAL_CA_PATH/hard.ifantasy.net/ca/crypto/ca-cert.pem $LOCAL_CA_PATH/hard.ifantasy.net/assets/ca-cert.pem
    cp $LOCAL_CA_PATH//ca/crypto/ca-cert.pem $LOCAL_CA_PATH/hard.ifantasy.net/assets/tls-ca-cert.pem
    echo "Preparation============================="
    echo "Enroll Admin"
    export FABRIC_CA_CLIENT_HOME=$LOCAL_CA_PATH/hard.ifantasy.net/registers/admin1
    export FABRIC_CA_CLIENT_TLS_CERTFILES=$LOCAL_CA_PATH/hard.ifantasy.net/assets/ca-cert.pem
    export FABRIC_CA_CLIENT_MSPDIR=msp
    fabric-ca-client enroll -d -u https://admin1:admin1@hard.ifantasy.net:7450
    mkdir -p $LOCAL_CA_PATH/hard.ifantasy.net/registers/admin1/msp/admincerts
    cp $LOCAL_CA_PATH/hard.ifantasy.net/registers/admin1/msp/signcerts/cert.pem $LOCAL_CA_PATH/hard.ifantasy.net/registers/admin1/msp/admincerts/cert.pem
    
    echo "Enroll Peer1"
    export FABRIC_CA_CLIENT_HOME=$LOCAL_CA_PATH/hard.ifantasy.net/registers/peer1
    export FABRIC_CA_CLIENT_TLS_CERTFILES=$LOCAL_CA_PATH/hard.ifantasy.net/assets/ca-cert.pem
    export FABRIC_CA_CLIENT_MSPDIR=msp
    fabric-ca-client enroll -d -u https://peer1:peer1@hard.ifantasy.net:7450
    # for TLS
    export FABRIC_CA_CLIENT_MSPDIR=tls-msp
    export FABRIC_CA_CLIENT_TLS_CERTFILES=$LOCAL_CA_PATH/hard.ifantasy.net/assets/tls-ca-cert.pem
    fabric-ca-client enroll -d -u https://peer1hard:peer1hard@:7050 --enrollment.profile tls --csr.hosts peer1.hard.ifantasy.net
    cp $LOCAL_CA_PATH/hard.ifantasy.net/registers/peer1/tls-msp/keystore/*_sk $LOCAL_CA_PATH/hard.ifantasy.net/registers/peer1/tls-msp/keystore/key.pem
    mkdir -p $LOCAL_CA_PATH/hard.ifantasy.net/registers/peer1/msp/admincerts
    cp $LOCAL_CA_PATH/hard.ifantasy.net/registers/admin1/msp/signcerts/cert.pem $LOCAL_CA_PATH/hard.ifantasy.net/registers/peer1/msp/admincerts/cert.pem
    
    mkdir -p $LOCAL_CA_PATH/hard.ifantasy.net/msp/admincerts
    mkdir -p $LOCAL_CA_PATH/hard.ifantasy.net/msp/cacerts
    mkdir -p $LOCAL_CA_PATH/hard.ifantasy.net/msp/tlscacerts
    mkdir -p $LOCAL_CA_PATH/hard.ifantasy.net/msp/users
    cp $LOCAL_CA_PATH/hard.ifantasy.net/assets/ca-cert.pem $LOCAL_CA_PATH/hard.ifantasy.net/msp/cacerts/
    cp $LOCAL_CA_PATH/hard.ifantasy.net/assets/tls-ca-cert.pem $LOCAL_CA_PATH/hard.ifantasy.net/msp/tlscacerts/
    cp $LOCAL_CA_PATH/hard.ifantasy.net/registers/admin1/msp/signcerts/cert.pem $LOCAL_CA_PATH/hard.ifantasy.net/msp/admincerts/cert.pem
    cp $LOCAL_ROOT_PATH/config/config-msp.yaml $LOCAL_CA_PATH/hard.ifantasy.net/msp/config.yaml
    echo "End hard============================="
  5. compose/docker-compose.yaml 中增加 hard 的 peer 服务:

    peer1.hard.ifantasy.net:
     container_name: peer1.hard.ifantasy.net
     extends:
         file: docker-base.yaml
         service: peer-base
     environment:
         - CORE_PEER_ID=peer1.hard.ifantasy.net
         - CORE_PEER_ADDRESS=peer1.hard.ifantasy.net:7051
         - CORE_PEER_LOCALMSPID=hardMSP
         - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.hard.ifantasy.net:7051
     volumes:
         - ${LOCAL_CA_PATH}/hard.ifantasy.net/registers/peer1:${DOCKER_CA_PATH}/peer
     ports:
         - 7451:7051
  6. 启动 hard 的 peer1 节点:

    docker-compose -f $LOCAL_ROOT_PATH/compose/docker-compose.yaml up -d peer1.hard.ifantasy.net

    此时所有容器如下:

    (base) root@DebianA:2_FabricNetworkUpdate# peer channel getinfo -c mychannel
    CONTAINER ID   IMAGE                                                                                                                                                                   COMMAND                  CREATED              STATUS              PORTS                              NAMES
    df4642a0bf08   hyperledger/fabric-peer:2.4                                                                                                                                             "peer node start"        About a minute ago   Up About a minute   0.0.0.0:7451->7051/tcp             peer1.hard.ifantasy.net
    d78d1b2cbaf3   hyperledger/fabric-ca:1.5                                                                                                                                               "sh -c'fabric-ca-se…"   3 minutes ago        Up 3 minutes        7054/tcp, 0.0.0.0:7450->7050/tcp   hard.ifantasy.net
    391fa186b804   dev-peer1.soft.ifantasy.net-basic_1-06613e463ef6694805dd896ca79634a2de36fdf019fa7976467e6e632104d718-179d27e486b248e3bc94f5930c2c5260638efbd88263aed0ba6f76d9751bfddf   "chaincode -peer.add…"   4 minutes ago        Up 4 minutes                                           dev-peer1.soft.ifantasy.net-basic_1-06613e463ef6694805dd896ca79634a2de36fdf019fa7976467e6e632104d718
    36af7b3c199a   dev-peer1.web.ifantasy.net-basic_1-06613e463ef6694805dd896ca79634a2de36fdf019fa7976467e6e632104d718-00e8af11004dcf6072478c9cb2633162b9675406392cbe9064feb13b007ea39e    "chaincode -peer.add…"   4 minutes ago        Up 4 minutes                                           dev-peer1.web.ifantasy.net-basic_1-06613e463ef6694805dd896ca79634a2de36fdf019fa7976467e6e632104d718
    98427d7781e7   hyperledger/fabric-peer:2.4                                                                                                                                             "peer node start"        5 minutes ago        Up 5 minutes        0.0.0.0:7351->7051/tcp             peer1.web.ifantasy.net
    117d9e5f6bd2   hyperledger/fabric-orderer:2.4                                                                                                                                          "orderer"                5 minutes ago        Up 5 minutes        7050/tcp, 0.0.0.0:7151->7777/tcp   orderer1.orderer.ifantasy.net
    0f41245b6b73   hyperledger/fabric-peer:2.4                                                                                                                                             "peer node start"        5 minutes ago        Up 5 minutes        0.0.0.0:7251->7051/tcp             peer1.soft.ifantasy.net
    c22772b88471   hyperledger/fabric-ca:1.5                                                                                                                                               "sh -c'fabric-ca-se…"   5 minutes ago        Up 5 minutes        7054/tcp, 0.0.0.0:7150->7050/tcp   orderer.ifantasy.net
    69af68afd2ed   hyperledger/fabric-ca:1.5                                                                                                                                               "sh -c'fabric-ca-se…"   5 minutes ago        Up 5 minutes        7054/tcp, 0.0.0.0:7350->7050/tcp   web.ifantasy.net
    6398c8406524   hyperledger/fabric-ca:1.5                                                                                                                                               "sh -c'fabric-ca-se…"   5 minutes ago        Up 5 minutes        7054/tcp, 0.0.0.0:7250->7050/tcp   soft.ifantasy.net
    d0d2ddc99a82   hyperledger/fabric-ca:1.5                                                                                                                                               "sh -c'fabric-ca-se…"   5 minutes ago        Up 5 minutes        0.0.0.0:7050->7050/tcp, 7054/tcp   
  7. 创立 hard 的 peer1 的环境变量文件 envpeer1hard

    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 hard"
    export FABRIC_CFG_PATH=$LOCAL_ROOT_PATH/config
    export CORE_PEER_TLS_ENABLED=true
    export CORE_PEER_LOCALMSPID="hardMSP"
    export CORE_PEER_ADDRESS=peer1.hard.ifantasy.net:7451
    export CORE_PEER_TLS_ROOTCERT_FILE=$LOCAL_CA_PATH/hard.ifantasy.net/assets/tls-ca-cert.pem
    export CORE_PEER_MSPCONFIGPATH=$LOCAL_CA_PATH/hard.ifantasy.net/registers/admin1/msp
    export ORDERER_CA=$LOCAL_CA_PATH/orderer.ifantasy.net/registers/orderer1/tls-msp/tlscacerts/tls--7050.pem

    获取通道最新配置

    在 fabric 中,通道配置内容是版本化的,这种配置能够在保障了并行性的同时避免通道配置更新被重放攻打。在以上流程咱们曾经生成了 hard 组织的所有须要的证书,但因为 hard 组织还不是通道 mychannel 的成员,所以咱们须要通过另一个已在 mychannel 组织的管理员来获取通道配置(比方 soft 或者 web)。如果通过 soft 组织管理员来获取通道最新配置:

    source envpeer1soft
    peer channel fetch config update/config_block.pb -o orderer1.orderer.ifantasy.net:7151 -c mychannel --tls --cafile $ORDERER_CA

    以上命令将通道配置区块以二进制 protobuf 模式保留在 config_block.pb 中,输入文件的名字和扩展名只管能够任意指定,而后能够在命令行中看到以下日志:

    2022-04-04 15:22:48.759 CST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
    2022-04-04 15:22:48.761 CST 0002 INFO [cli.common] readBlock -> Received block: 5
    2022-04-04 15:22:48.761 CST 0003 INFO [channelCmd] fetch -> Retrieving last config block: 0
    2022-04-04 15:22:48.762 CST 0004 INFO [cli.common] readBlock -> Received block: 0

    因为咱们在创立 mychannel 后并没有进行任何的通道更新操作,所以目前最新 mychannel 的配置区块是初始区块 0,在更新一次后的下一节中咱们会发现获取的配置区块不再是 0。

    转换配置格局并简化

    当初能够用 configtxlator 工具将这个通道配置解码为 JSON 格局(以便被敌对地浏览和批改),而后应用 jq 工具裁剪其头部、元数据、创建者签名等所有和减少组织无关的内容:

    configtxlator proto_decode --input update/config_block.pb --type common.Block | jq .data.data[0].payload.data.config > update/config.json

    增加通道 hard 配置

    接下来咱们须要通过 configtxgen 生成 hard 组织的定义,configtxgen 的输入取决于配置文件 configtx.yaml 的内容,该文件的门路由环境变量 FABRIC_CFG_PATH 指定。在 config/configtx.yaml 内减少 hard 的组织定义:

而后应用命令生成 hard 组织定义文件:

configtxgen -printOrg hardMSP > $LOCAL_CA_PATH/hard.ifantasy.net/hard.json

下面的命令会创立一个 hard.json 文件并将其写入到 $LOCAL_CA_PATH/hard.ifantasy.net/ 文件夹下,前面将通过把该文件附加到 mychannel 通道配置中来实现将 hard 增加到通道中,该文件蕴含了 hard 组织的策略定义和三个 base64 格局的重要证书:

  • 组织根证书, 用于建设组织的根信赖
  • TLS 根证书, 用于在 gossip 协定中辨认 hard 组织的区块流传和服务发现
  • 管理员用户证书

接下来再次应用 jq 工具去追加 hard 的配置定义 hard.json 到通道的利用组字段,并将后果输入到文件 modified_config.json

jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"hardMSP":.[1]}}}}}' update/config.json $LOCAL_CA_PATH/hard.ifantasy.net/hard.json > update/modified_config.json

当初,咱们曾经获取了两个重要的 JSON 文件:config.jsonmodified_config.json。通道初始配置 config.json 蕴含 soft 和 web 组织,而 modified_config.json 文件则蕴含了所有 3 个组织,之后则须要将这 2 个 JSON 文件从新编码并计算出差别局部。

首先,将 config.json 文件倒回到 protobuf 格局并输入到 config.pb

configtxlator proto_encode --input update/config.json --type common.Config --output update/config.pb

其次,将 modified_config.json 编码成 modified_config.pb

configtxlator proto_encode --input update/modified_config.json --type common.Config --output update/modified_config.pb

而后,应用 configtxlator 去计算两个 protobuf 配置的差别,并将输入的 protobuf 内容写入hard_update.pb :

configtxlator compute_update --channel_id mychannel --original update/config.pb --updated update/modified_config.pb --output update/hard_update.pb

再次,咱们将这个文件解码成可编辑的 JSON 格局,并命名为 hard_update.json

configtxlator proto_decode --input update/hard_update.pb --type common.ConfigUpdate | jq . > update/hard_update.json

之后,咱们须要用信封音讯来包装解码后的更新文件 hard_update.json,这个步骤要把之前裁剪掉的头部信息还原回来,将这个文件命名为hard_update_in_envelope.json

echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel","type":2}},"data":{"config_update":'$(cat update/hard_update.json)'}}}' | jq . > update/hard_update_in_envelope.json

最初,应用 configtxlator 工具将格式化好的 hard_update_in_envelope.json 转换为 Fabric 须要的 protobuf 格局的文件hard_update_in_envelope.pb

configtxlator proto_encode --input update/hard_update_in_envelope.json --type common.Envelope --output update/hard_update_in_envelope.pb

签名并提交配置更新

咱们在通道创世区块配置 configtx.yaml 中的通道利用组的批改策略设置是 MAJORITY,因而咱们须要曾经存在于通道的大部分组织管理员去签名这个更新。而目前 mychannel 中只有两个组织—— soft 和 web,所以须要两个组织都签名能力胜利批改,否则排序服务会因为不满足策略而回绝这个交易。签名并提交配置更新的流程如下:

  1. soft 管理员来签名这个通道更新:

    source envpeer1soft
    peer channel signconfigtx -f update/hard_update_in_envelope.pb
  2. web 管理员签名并提交通道更新(因为提交更新命令 peer channel update 会主动附带提交者的签名,所以可间接提交通道更新):

    source envpeer1web
    peer channel update -f update/hard_update_in_envelope.pb -c mychannel -o orderer1.orderer.ifantasy.net:7151 --tls --cafile $ORDERER_CA

    胜利的通道更新调用会创立一个新的区块——区块 7,并将其同步给所有在这个通道上的 peer 节点,此时通道 mychannel 的区块高度减少 1:

    (base) root@DebianA:2_FabricNetworkUpdate# peer channel getinfo -c mychannel
    2022-04-04 16:26:08.000 CST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
    Blockchain info: {"height":7,"currentBlockHash":"xDbfklqBLaaQ2x8L1omHKedmiQWibbDto6X9ED700pg=","previousBlockHash":"7ZN2T3iTtuWet26UQU4br9ZgrEu6927+/AOjhGELgKw="}

    将 hard 组织退出通道

    通过以上步骤后,mychannel 通道的配置曾经更新并蕴含了 hard 组织,当初只须要让 hard 的 peer 节点被动退出并同步区块最新数据即可。peer 拉取 mychannel 创世区块:

    source envpeer1hard
    peer channel fetch 0 mychannel.block -o orderer1.orderer.ifantasy.net:7151 -c mychannel --tls --cafile $ORDERER_CA

    留神,这里的 0 示意咱们想要拉取的区块高度——即创世区块,如果简略地执行 peer channel fetch config 命令会拉取最新的带有 hard 组织定义的区块——区块 7,然而任何一个账本都不能从一个上游区块开始记录,因而必须为0

如果胜利,该命令将创世块返回到名为 mychannel.block 的文件,而后便能够应用应用 peer 通过这个区块连贯到通道:

peer channel join -b mychannel.block

以上命令执行结束后,查看以后块高度为 7:

(base) root@DebianA:2_FabricNetworkUpdate# source envpeer1web
(base) root@DebianA:2_FabricNetworkUpdate# peer channel getinfo -c mychannel
2022-04-04 20:28:54.457 CST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
Blockchain info: {"height":7,"currentBlockHash":"UErIVVGNUXWW0g0EPE3t0PQnwVdc/GyXAjsotCpqgjQ=","previousBlockHash":"+ZrOH83va6XWuRttUKhRaeNAeV1CyNjkRiQlZbb/0lg="}

删除旧组织

本节将演示在上节网络中删除一个旧组织——soft(软件组)2

获取通道最新配置

通过 web 组织管理员来获取通道最新配置:

source envpeer1web
peer channel fetch config update/config_block.pb -o orderer1.orderer.ifantasy.net:7151 -c mychannel --tls --cafile $ORDERER_CA

以上命令将通道配置区块以二进制 protobuf 模式保留在 config_block.pb 中,输入文件的名字和扩展名只管能够任意指定,而后能够在命令行中看到以下日志:

(base) root@DebianA:2_FabricNetworkUpdate# peer channel fetch config update/config_block.pb -o orderer1.orderer.ifantasy.net:7151 -c mychannel --tls --cafile $ORDERER_CA
2022-04-04 16:59:42.952 CST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
2022-04-04 16:59:42.954 CST 0002 INFO [cli.common] readBlock -> Received block: 6
2022-04-04 16:59:42.954 CST 0003 INFO [channelCmd] fetch -> Retrieving last config block: 6
2022-04-04 16:59:42.961 CST 0004 INFO [cli.common] readBlock -> Received block: 6

转换配置格局并简化

configtxlator 工具将这个通道配置解码为 JSON 格局(以便被敌对地浏览和批改),而后应用 jq 工具裁剪其头部、元数据、创建者签名等所有和删除组织无关的内容:

configtxlator proto_decode --input update/config_block.pb --type common.Block | jq .data.data[0].payload.data.config > update/config.json

删除通道 soft 配置

  1. 应用 jq 工具去追加 soft 的删除命令并写入 modified_config.json

    jq 'del(.channel_group.groups.Application.groups.softMSP)'  update/config.json > update/modified_config.json

    其中,通道原始配置 config.json 蕴含全副 3 个组织,而 modified_config.json 文件则只蕴含 2 个组织 web 和 hard,之后须要将这 2 个 JSON 文件从新编码并计算出差别局部。

  2. config.json 文件倒回到 protobuf 格局并输入到 config.pb

    configtxlator proto_encode --input update/config.json --type common.Config --output update/config.pb
  3. modified_config.json 编码成 modified_config.pb

    configtxlator proto_encode --input update/modified_config.json --type common.Config --output update/modified_config.pb
  4. 应用 configtxlator 去计算两个 protobuf 配置的差别,并将输入的 protobuf 内容写入 soft_update.pb

    configtxlator compute_update --channel_id mychannel --original update/config.pb --updated update/modified_config.pb --output update/soft_update.pb
  5. 将这个文件解码成可编辑的 JSON 格局,并命名为 soft_update.json

    configtxlator proto_decode --input update/soft_update.pb --type common.ConfigUpdate | jq . > update/soft_update.json
  6. 用信封音讯来包装解码后的更新文件 soft_update.jsonsoft_update_in_envelope.json

    echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel","type":2}},"data":{"config_update":'$(cat update/soft_update.json)'}}}' | jq . > update/soft_update_in_envelope.json
  7. 应用 configtxlator 工具将 soft_update_in_envelope.json 转换为 protobuf 格局 soft_update_in_envelope.pb

    configtxlator proto_encode --input update/soft_update_in_envelope.json --type common.Envelope --output update/soft_update_in_envelope.pb

    签名并提交配置更新

  8. web 签名通道更新:

    source envpeer1web
    peer channel signconfigtx -f update/soft_update_in_envelope.pb
  9. hard 签名并提交通道更新:

    source envpeer1hard
    peer channel update -f update/soft_update_in_envelope.pb -c mychannel -o orderer1.orderer.ifantasy.net:7151 --tls --cafile $ORDERER_CA

    咱们在通道创世区块配置 configtx.yaml 中的通道利用组中的批改策略设置是 MAJORITY,因而咱们须要曾经存在于通道的大部分组织管理员去签名这个更新。而目前 mychannel 中有 3 个组织,所以只须要 2 个组织签名就能够胜利批改,也就是说,咱们 把 soft 踢出通道并不需要通过它本人批准

    验证删除后果

  10. 最初提交通道更新后,可在 orderer1 容器日志中看到如下信息:

    2022-04-04 11:33:30.141 UTC 007c WARN [policies] SignatureSetToValidIdentities -> invalid identity error="MSP softMSP is not defined on channel" identity="(mspid=softMSP subject=CN=peer1,OU=peer,O=Hyperledger,ST=North Carolina,C=US issuer=CN=soft.ifantasy.net,OU=Fabric,O=Hyperledger,ST=North Carolina,C=US serialnumber=713584922830159624441374963904174405230312956160)"
  11. soft 组织的 peer 节点曾经无奈拉取通道配置:

    (base) root@DebianA:2_FabricNetworkUpdate# peer channel fetch config update/config_block.pb -o orderer1.orderer.ifantasy.net:7151 -c mychannel --tls --cafile $ORDERER_CA
    2022-04-04 19:43:54.133 CST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
    2022-04-04 19:43:54.134 CST 0002 INFO [cli.common] readBlock -> Expect block, but got status: &{FORBIDDEN}
    Error: can't read the block: &{FORBIDDEN}

    以上命令执行结束后,查看以后块高度为 8:

    (base) root@DebianA:2_FabricNetworkUpdate# source envpeer1web
    (base) root@DebianA:2_FabricNetworkUpdate# peer channel getinfo -c mychannel
    2022-04-04 20:42:47.530 CST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
    Blockchain info: {"height":8,"currentBlockHash":"FdrpWDsifgih6QzpB4tZ6LPWcYUy9DSDI6jngXiGnC0=","previousBlockHash":"UErIVVGNUXWW0g0EPE3t0PQnwVdc/GyXAjsotCpqgjQ="}

参考

<!– 1: 作者. 文章题目. 发表地. [发表或更新日期] –>


  1. Hyperledger. 向通道增加组织. hyperledger-fabric.readthedocs.io. [2022-02-25] ↩
  2. 小蜗牛爬楼梯. fabric1.4 动静删除组织(删除 peer 节点). 简书. [2021-01-22] ↩
退出移动版