Fabric手动部署first-network

    在Fabric v1.4~v2.3版本里,有个first-network案例,运行first-network/byfn.sh脚本就可以测试当前fabric 单机网络是否安装成功。这里,使用手动部署的方式,来取代自动化部署。
 软件环境如下:
    fabric-samples v1.4.3
    fabric v1.4.3
    fabric ca v1.4.3
    Ubuntu 16.04

1、备份first-network,然后精简first-network

    a)备份first-network

cd $GOPATH/src/github.com/hyperledger/fabric-samples
tar -czvf first-network_0803_bak.tar.gz first-network

    b)精简first-network
去掉不相干的.yaml和文件夹,精简之后的first-network,如下所示:

Fabric手动部署first-network
图(1) 精简first-network文件夹
    2个文件夹+7个.yaml文件。

2、用工具生成证书、创世区块、通道配置、锚节点文件

2.1 制作身份证书

    使用 cryptogen 工具将文件 crypto-config.yaml 作为参数配置生成组织结构与身份证书

cd ./fabric-sample/first-network
../bin/cryptogen generate --config=./crypto-config.yaml

2.2 生成创世区块

## 使能FABRIC_CFG_PATH 变量
export FABRIC_CFG_PATH=$PWD

## 生成创世区块
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

2.3 生成通道配置文件

    创建一个mychannel的通道,并生成通道配置文件channel.tx,其保存在first-network/channel-artifacts目录下。

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

2.4 生成2个组织的锚节点文件

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

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

3、启动分布式网络

    使用 docker-compose 工具将 docker-compose-cli.yaml 文件作为参数,启动提供网络服务的各个节点

cd $GOPATH/src/github.com/hyperledger/fabric-samples/first-network
docker-compose -f docker-compose-cli.yaml up -d

4、创建通道,把节点加入通道

4.1 创建通道

    a) 进入cli容器

docker exec -it cli bash 

    b) 设置环境变量

export CHANNEL_NAME=mychannel
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

    c) 根据环境变量,来创建通道

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile $ORDERER_CA

4.2 加入通道

    a) peer0.org1加入通道
由于cli 容器默认为peer0.org1,所以可以直接加入通道。

peer channel join -b mychannel.block

    b) peer1.org1加入通道
peer1.org1与peer0.org1只有peer的地址不相同,修改即可,然后加入通道。

CORE_PEER_ADDRESS=peer1.org1.example.com:8051
peer channel join -b mychannel.block

    c)peer0.org2 加入通道

    由于peer0.org2是在org2里,当前cli是org1,所以需要切换peer参数。

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

d) peer1.org2加入通道

CORE_PEER_ADDRESS=peer1.org2.example.com:10051
peer channel join -b mychannel.block

5、更新锚节点,并安装链码

    每个组织里只有一个锚节点,它负责跨组织通信。现在有2个组织:org1、org2,所以只需要为这2个组织分别设置一锚节点即可。

5.1 将peer0.org1 更新为org1里的锚节点,并安装链码

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

peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $ORDERER_CA
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/

5.2 将peer0.org2 更新为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 channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile $ORDERER_CA
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/

6、实例化链码,并测试

    a) 实例化

peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"

    b) 查询

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

    c) 调用

peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -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"]}'

效果如下:

Fabric手动部署first-network
图(2) 在order上实例化链码,并调用

    d) 在peer1.org1上也安装链码,并测试

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=peer1.org1.example.com:8051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt

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

    查询a的值

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

    效果如下:

Fabric手动部署first-network
图(3) 在peer1.org1上安装链码,并调用

6、关闭和清空fabric网络

    使用指定的 docker-compose-cli.yaml 配置文件关闭网络:

sudo docker-compose -f docker-compose-cli.yaml down --volumes 

    清空channel-artifacts文件夹,只保留空文件夹;删除整个crypto-config文件。

sudo rm -r channel-artifacts crypto-config
上一篇:LeetCode | 326. Power of Three


下一篇:六:Gateway网关限流