zoukankan      html  css  js  c++  java
  • 【Fabric】在fabric运行网络中动态添加组织

    1.前置条件

    fabric版本:1.4

    运行环境:fabric-samples/first-network

    docker-compose-cli.yamlcli和docker-compose-org3.yaml中Org3cli容器设置为DEBUG

    cli:
      container_name: cli
      image: hyperledger/fabric-tools:$IMAGE_TAG
      tty: true
    stdin_open: true
    environment:
        - GOPATH=/opt/gopath
        - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
        #- FABRIC_LOGGING_SPEC=INFO
        - FABRIC_LOGGING_SPEC=DEBUG
    Org3cli:
      container_name: Org3cli
      image: hyperledger/fabric-tools:$IMAGE_TAG
      tty: true
    stdin_open: true
    environment:
        - GOPATH=/opt/gopath
        - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
        #- FABRIC_LOGGING_SPEC=INFO
        - FABRIC_LOGGING_SPEC=DEBUG

    同时,开启first-network中的fabric网络

    • ./byfn.sh generate
    • ./byfn.sh up

    2.生成Org3加密材料

    进入org3-artifacts目录里,这里有两个配置文件org3-crypto.yaml和configfx.yaml

    image-20200317141109350

    首先使用org3-crypto.yaml文件来生成Org3的CA和Org3下两个peer节点的密钥和证书,保存在当前目录下的crypto-config中

    • ../../bin/cryptogen generate --config=./org3-crypto.yaml

    接着使用configtx.yaml文件生成包含Org3的json格式的特定配置文件,文件保存在first-network/channel-artifacts中。该文件包含Org3的策略定义,以及以base 64格式显示的三个重要证书:admin用户证书(以后将需要用作Org3的管理员),CA root证书和TLS root证书 在接下来的步骤中,我们会将这个JSON文件附加到通道配置中。

    • export FABRIC_CFG_PATH=$PWD && ../../bin/configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json

    最后,将Orderer Org的MSP材料复制到Org3 crypto-config目录中。特别是,Orderer的TLS root证书,该证书将允许Org3实体与网络Orderer节点之间的安全通信。

    • cd ../ && cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/

    3.更新通道配置

    进入cli容器中,设置环境变量(tip:不管什么原因退出容器,再次进入容器时都需要重新设置环境变量)

    • docker exec -it cli bash export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem && export CHANNEL_NAME=mychannel

    接下来,获取通道的配置文件,在当前目录下生成config_block.pb

    • peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

    接下来的操作可以继续在cli容器里进行,但如果你运行出错了,可以把配置文件拷贝到容器外操作

    首先安装jq工具,以便之后对json文件进行修改

    • apt update && apt install -y jq

    在容器外执行以下命令,拷贝配置文件config_block.pb

    • docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/config_block.pb ./kar/

    进入kar文件夹内,使用该configtxlator工具将config_block.pb解码为json格式

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

    再次使用该jq工具将Org3配置定义org3.json附加到通道的应用程序组字段,并将输出命名为– modified_config.json

    • jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ../channel-artifacts/org3.json > modified_config.json

    将config.json编码成二进制文件config.pb

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

    将modified_config.json编码成二进制文件modified_config.pb

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

    使用configtxlator计算出config.pb和modified_config.pb之间的差异,输出为org3_update.pb

    • export CHANNEL_NAME=mychannel ../../bin/configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output org3_update.pb

    将org3_update.pb解码为json文件

    • ../../bin/configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate | jq . > org3_update.json

    之后需要将其包装在信封消息中,因此需要为org3_update.json补充标头字段

    • echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL_NAME'", "type":2}},"data":{"config_update":'$(cat org3_update.json)'}}}' | jq . > org3_update_in_envelope.json

    将org3_update_in_envelope.json编码成二进制文件

    • ../../bin/configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb

    接下来,将生成的org3_update_in_envelope.pb拷贝到cli容器里

    • docker cp org3_update_in_envelope.pb cli:/opt/gopath/src/github.com/hyperledger/fabric/peer

    4.签名并提交配置更新

    在将配置写入账本之前,我们需要来自必需的Admin用户的签名。我们的通道“应用程序”组的修改策略(mod_policy)设置为默认值“ MAJORITY”,这意味着我们需要大多数现有组织管理员来对其进行签名。因为我们只有两个组织– Org1和Org2 –且大多数是两个,所以我们都需要它们进行签名。没有这两个签名,订购服务将因未能履行政策而拒绝交易。

    当前cli容器是由Org1 MSP材料引导的。所以直接进行Org1的签名

    • peer channel signconfigtx -f org3_update_in_envelope.pb

    接下来切换到Org2

    export CORE_PEER_LOCALMSPID="Org2MSP"
    export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
    export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    export CORE_PEER_ADDRESS=peer0.org2.example.com:7051

    接下来可以不用再签名,可以直接提交配置更新,因为签名已经包含在提交更新中

    • peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CAimage-20200317151053184

    5.将Org3加入到网络中

    另开一个终端,启动Org3的docker集群

    • docker-compose -f docker-compose-org3.yaml up -d

    进入Org3cli容器,并添加环境变量

    • docker exec -it Org3cli bash export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem && export CHANNEL_NAME=mychannel

    获取channel的区块,并测试Org3是否成功加入网络

    • peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

    若得到以下的日志输出,并在当前目录下生成mychannel.block,则说明Org3成功加入网络中

    image-20200317152242838

    接下来将Org3下的peer节点加入通道中,首先peer0加入通道

    • peer channel join -b mychannel.block

    切换到peer1节点,并加入通道

    • export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls/ca.crt && export CORE_PEER_ADDRESS=peer1.org3.example.com:7051
    • peer channel join -b mychannel.block

    6.升级并调用链码

    为了使Org3真正发挥作用,需要升级链码和背书策略

    在Org3cli中升级链码

    • peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/

    在cli容器里升级链码,根据之前的操作,先在Org2里升级链码

    • peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/

    接下来,切换到Org1里升级链码

    export CORE_PEER_LOCALMSPID="Org1MSP"
     
    export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
    
    export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
     
    export CORE_PEER_ADDRESS=peer0.org1.example.com:7051 peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go

    之后,升级背书策略

    • peer chaincode upgrade -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 2.0 -c '{"Args":["init","a","90","b","210"]}' -P "OR('Org1MSP.peer','Org2MSP.peer','Org3MSP.peer')"

    接着可以在Org3cli中执行查询(检验升级是否成功)

    • peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
    Query Result: 90

    image-20200318122139654

    从a转移10到b

    • peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

    在cli中查询

    • peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
    Query Result: 80

    image-20200318122225724

    至此,在网络中动态添加组织成功。

    参考文献

  • 相关阅读:
    ndarray数据类型
    创建ndarray
    SqlHelper
    插入订单并且输出订单号的sql存储过程
    JQury自动切换图片
    设计模式--责任链模式
    设计模式--模板方法模式
    设计模式--观察者模式
    设计模式--享元模式
    设计模式--组合模式
  • 原文地址:https://www.cnblogs.com/jxd283465/p/13530044.html
Copyright © 2011-2022 走看看