• 构建你的第一个网络--fabric--release-1.4


    一、自动构建

    1.生成网络构件(进入 first-network 目录下)

    ./byfn.sh generate

    第一步为我们的各种网络实体生成证书和秘钥。创世区块 genesis block用于引导排序服务,也包含了一组配置 Channel 所需要的配置交易集合。

    2.启动网络

    ./byfn.sh up

    这一步会启动所有的容器,然后启动一个完整的 end-to-end 应用场景。完成后,它应该在您的终端窗口中显示以下内容:

    Query Result: 90
    2017-05-16 17:08:15.158 UTC [main] main -> INFO 008 Exiting.....
    ===================== Query successful on peer1.org2 on channel 'mychannel' =====================
    
    ===================== All GOOD, BYFN execution completed =====================
    
    
     _____   _   _   ____
    | ____| |  | | |  _ 
    |  _|   |  | | | | | |
    | |___  | |  | | |_| |
    |_____| |_| \_| |____/

    3.关闭网络

    ./byfn.sh down

    这一步会结束掉你所有的容器,移除加密的材料和四个构件,并且从 Docker 仓库删除链码镜像。

    二、手动构建

    1.手动生成构件

    为组织生成证书

    cryptogen generate --config=./crypto-config.yaml

    终端将会输出

    org1.example.com
    org2.example.com

    告诉 configtxgen 工具去哪儿寻找它需要的 configtx.yaml 文件

    export FABRIC_CFG_PATH=$PWD

    创建排序通道创世区块

    configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block

     并出现下列类似输出

    2020-07-05 10:37:52.167 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 005 Loaded configuration: /root/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/configtx.yaml
    2020-07-05 10:37:52.169 CST [common.tools.configtxgen] doOutputBlock -> INFO 006 Generating genesis block
    2020-07-05 10:37:52.170 CST [common.tools.configtxgen] doOutputBlock -> INFO 007 Writing genesis block

    2.创建通道配置交易

    export CHANNEL_NAME=mychannel
    configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

    为构建的通道上的组织 Org1 、Org2 定义锚节点

    configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
    configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP

    3.启动网络

    启动容器

    # 可以使用命令 sudo docker ps 查看容器是否启动成功
    docker-compose -f docker-compose-cli.yaml up -d

    进入cli容器

    docker exec -it cli bash

    如果成功则会发现

    root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#

    4.创建和加入通道

    创建通道

    export CHANNEL_NAME=mychannel
    
    peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

    把 peer0.org1.example.com 加入通道

    peer channel join -b mychannel.block

    注意:如果你想向其他 Peer 节点或者排序节点发送调用,那么你发送任何 CLI 调用的时候都需要像下边的命令一样覆盖这些环境变量(当前节点是peer0,因此无需更改)

    # Environment variables for PEER0
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" 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

    把 peer0.org2.example.com 加入通道

    # 配置环境变量
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    CORE_PEER_ADDRESS=peer0.org2.example.com:9051
    CORE_PEER_LOCALMSPID="Org2MSP"
    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

    #加入通道
    peer channel join -b mychannel.block

    5.更新锚节点

    # 配置环境
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
    CORE_PEER_ADDRESS=peer0.org1.example.com:7051
    CORE_PEER_LOCALMSPID="Org1MSP"
    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
    # 将 Org1 的锚节点定义为 peer0.org1.example.com
    peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    # 配置环境
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp 
    CORE_PEER_ADDRESS=peer0.org2.example.com:9051 
    CORE_PEER_LOCALMSPID="Org2MSP" 
    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 
    # 将 Org2 的锚节点定义为 peer0.org2.example.com
    peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

    6.安装和实例化链码

    • 链码的实例化只需要一次
    • 链码的安装针对每个背书节点,都需要安装一次。

    在 Org1 的 peer0 节点上安装 Go 链码(如果安装出现问题请配置环境后再次尝试)

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

    在 Org2 的 peer0 节点上也安装链码

    # Environment variables for PEER0 in Org2
    
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    CORE_PEER_ADDRESS=peer0.org2.example.com:9051
    CORE_PEER_LOCALMSPID="Org2MSP"
    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

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

    实例化链码

    peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"

    7.查询与调用

    查询 a 的值,以确保链码被正确实例化并且向状态数据库写入了数据

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

    调用,从 a 账户向 b 账户转账 10 

    peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'

    再次查询

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

    由于 a 的初始值为 100 ,你会发现

    Query Result: 90

    8.后续可以继续为其他节点安装链码

    在 Org2 的 peer1 节点上安装链码

    # Environment variables for PEER1 in Org2
    
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    CORE_PEER_ADDRESS=peer1.org2.example.com:10051
    CORE_PEER_LOCALMSPID="Org2MSP"
    CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
    
    peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/

    查询

    # Org2 的 peer1 需要先加入通道才可以响应查询
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer1.org2.example.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
    peer channel join -b mychannel.block peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

    结果

    Query Result: 90

    接下来你可以随意尝试了~

    作者:mhly

    博客:https://www.cnblogs.com/mhly

    本文采用BY-NC-SA许可协议,转载请注明出处

  • 相关阅读:
    LeetCode刷题--只出现一次的数
    Java进阶--多线程
    .NETCore :正则表达式
    .net core多线程:Thread
    .NETCore : Linq简介
    .NET Core:List,ArrayList和Dictionary
    .NET Core 装箱与拆箱
    .NET Core 泛型、逆变与协变
    .NET Core 类的生命周期
    .NET Core 类的多态与继承
  • 原文地址:https://www.cnblogs.com/mhly/p/13236629.html
Copyright © 2020-2023  润新知