HyperLedger Fabric 2.0(Raft部署)

4,133 阅读3分钟

准备8台虚拟机,这里使用Vagrant创建centos7,1台用于nfs服务(这里使用nfs服务,就不需要将证书、区块等文件跨主机拷来拷去的了),另外7台用于部署fabric节点,如下图所示:

虚拟机创建配置文件以及fabric部署资源已经打包好,点击这里获取,如果你已经获取下来了,进入到该文件夹内,开始部署fabric2.0 raft网络。

Fabric配置生成

我们需要在NFS Server服务器的/share目录生成证书文件、创世区块、通道文件。

首先启动NFS Server虚拟机,切换到root用户,并进入/share目录。

#启动虚拟机
vagrant up nfsserver
#登录虚拟机
vagrant ssh nfsserver
####以下在虚拟机内执行####
#切换root用户
sudo su
cd /share

接下来生成证书

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

生成创世区块,先创建channel-artifacts文件夹。

mkdir channel-artifacts
./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block -channelID system

生成通道。

./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel

OK,fabric所需的配置文件已经生成好了,接下来部署Orderer集群。

部署Orderer集群

orderer节点的yaml文件已经准备好了,只需要通过docker-compose启动即可。

首先启动orderer的三台虚拟机

vagrant up orderer0
vagrant up orderer1
vagrant up orderer2

在三台orderer虚拟机上分别启动orderer0节点、orderer1节点、orderer2节点。

docker-compose -f docker-compose-orderer-00.yaml up -d
docker-compose -f docker-compose-orderer-01.yaml up -d
docker-compose -f docker-compose-orderer-02.yaml up -d

orderer集群部署完成后,即可部署Org1Org2

部署Org1和Org2

启动剩余4台虚拟机:peer0-org1、pee1-org1、peer0-org2、peer1-org2。

vagrant up peer0org1
vagrant up peer1org1
vagrant up peer0org2
vagrant up peer1org2

在4台虚拟机上分别启动peer0-org1、peer1-org1、peer0-org2、peer1-org2节点。

docker-compose -f docker-compose-peer0-org1.yaml up -d
docker-compose -f docker-compose-peer1-org1.yaml up -d
docker-compose -f docker-compose-peer0-org2.yaml up -d
docker-compose -f docker-compose-peer1-org2.yaml up -d

加入通道

当所有节点都启动后并且正常运行后,通过cli工具可以创建通道、加入通道、部署合约、调用合约。

首先在peer0-org1节点的主机上创建通道,需要进入cli容器。

docker exec -it cli bash

以下内容都在cli容器内执行

创建通道,需要使用orderer节点证书。

ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

peer channel create -o orderer0.example.com:7050 -c mychannel -f ./channel-artifacts/mychannel.tx --outputBlock ./channel-artifacts/mychannel.block --tls --cafile $ORDERER_CA

加入通道

# peer 加入channel
peer channel join -b ./channel-artifacts/mychannel.block

ok,目前通道已经创建,peer0-org1已经加入该通道,下面将另外三个peer节点也加入该通道。

peer1-org1,peer0-org2,peer1-org2三个节点主机上执行完下面的命令,即加入通道完成。

#进入cli
docker exec -it cli bash
peer channel join -b ./channel-artifacts/mychannel.block

通道加入之后,可以部署合约了。

部署合约

Fabric2.0的链码生命周期发生比较大的变化,需要历经以下步骤才能完成合约的部署:

  • 打包链码
  • 安装链码
  • 组织批准
  • 提交链码

打包链码,需要在个peer节点上执行,合约打包时,需要依赖包,这里使用go mod vebdor 将依赖下载下来。

#cli容器中
cd chaincode/go/abstore
#下载依赖文件
go mod vendor
#回到初吃目录
cd ../../../
#打包链码
peer lifecycle chaincode package cc.tar.gz --path github.com/hyperledger/fabric/peer/chaincode/go/abstore --lang golang --label mycc

安装链码,每个peer节点上都需要执行。

#cli容器中
#安装链码
peer lifecycle chaincode install cc.tar.gz

查询链码安装

#cli容器中
#查询安装的链码,可以获取到链码的 package_id
peer lifecycle chaincode queryinstalled

当前组织批准链,fabric2.0默认情况下需要半数以上的组织批准链码,本次部署的fabric网络中存在两个组织,因此这个两个组织都需要批准链码;批准链码只需要在组织中的任意一个peer节点的cli容器执行批准操作即可。

批准链码需要用到链码的package_id,本次部署网络中只需要在peer0-org1 和peer0-org2 执行以下命令

peer lifecycle chaincode approveformyorg --tls true --cafile $ORDERER_CA --channelID mychannel -n mycc -v 1 --init-required --package-id mycc:3ffc03cb2be5e15eac954c8c836ca994d5f298901b35087bd12b336caf2142fb --sequence 1 --waitForEvent

查询链码批准情况

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name mycc -v 1 --sequence 1 --output json --init-required

当出现如上图所示的结果时,即半数以上的组织都已批准,即可执行链码的提交。

提交链码,在任意一台peer主机的cli容器内执行如下命令,一定要确保每个已批准的组织同时提交,即每个已批准的组织内的peer一同参与提交。如下命令,初始化时,指定了peer0.org1.example.com和peer0.org2.example.com。。

peer lifecycle chaincode commit -o orderer0.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1 --sequence 1 --init-required --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:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

查看已提交的链码

peer lifecycle chaincode querycommitted -C mychannel -n mycc

初始化合约,在任意一台peer主机的cli容器内执行如下命令,一定要确保每个已批准的组织同时参与到初始化,即每个已批准的组织内的peer一同参与初始化。如下命令,初始化时,指定了peer0.org1.example.com和peer0.org2.example.com。

peer chaincode invoke -o orderer0.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -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:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt  --isInit -c '{"Args":["Init","a","100","b","100"]}'

查询a的值,结果显示100。

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