一朵小奇葩✿ۣ

导航

Hyperledger Fabric V1.4.6(一)手动搭建Fabric网络(基于first-network)

  如果还不具备Hyperledger Fabric的完整环境,请参考:Hyperledger Fabric(一)V2.0基础环境搭建(同样适用于V1.4版本,注意更换Fabric二进制文件及镜像的版本号,见本文档底部)。当前Fabric最新版本为V2.0 bate测试版,若想搭建最新版本Fabric网络,请参考:Hyperledger Fabric V2.0(五)手动搭建Fabric网络。请注意目前V2.0版本仍处于测试阶段,经个人尝试,发现java链码部署一直报错,尝试解决未果,因此在2.0正式版未被公布之前,建议部署V1.4+版本。在具备基础环境后,便可进行Fabric网络的部署工作。可以参照官网文档关于first-network教程的部分,使用提供的脚本文件快速启动区块链网络。但为了搭建自定义的Fabric网络,需要掌握脚本所执行的具体操作。


first-network教程中byfn.sh脚本使用说明如下:

Usage:
byfn.sh <mode> [-c <channel name>] [-t <timeout>] [-d <delay>] [-f <docker-compose-file>] [-s <dbtype>] [-l <language>] [-o <consensus-type>] [-i <imagetag>] [-a] [-n] [-v]
<mode> - one of 'up', 'down', 'restart', 'generate' or 'upgrade'
- 'up' - bring up the network with docker-compose up
- 'down' - clear the network with docker-compose down
- 'restart' - restart the network
- 'generate' - generate required certificates and genesis block
- 'upgrade' - upgrade the network from version 1.3.x to 1.4.0
-c <channel name> - channel name to use (defaults to "mychannel")
-t <timeout> - CLI timeout duration in seconds (defaults to 10)
-d <delay> - delay duration in seconds (defaults to 3)
-f <docker-compose-file> - specify which docker-compose file use (defaults to docker-compose-cli.yaml)
-s <dbtype> - the database backend to use: goleveldb (default) or couchdb
-l <language> - the chaincode language: golang (default) or node
-o <consensus-type> - the consensus-type of the ordering service: solo (default), kafka, or etcdraft
-i <imagetag> - the tag to be used to launch the network (defaults to "latest")
-a - launch certificate authorities (no certificate authorities are launched by default)
-n - do not deploy chaincode (abstore chaincode is deployed by default)
-v - verbose mode
byfn.sh -h (print this message)

Typically, one would first generate the required certificates and
genesis block, then bring up the network. e.g.:

byfn.sh generate -c mychannel
byfn.sh up -c mychannel -s couchdb
byfn.sh up -c mychannel -s couchdb -i 1.4.0
byfn.sh up -l node
byfn.sh down -c mychannel
byfn.sh upgrade -c mychannel

Taking all defaults:
byfn.sh generate
byfn.sh up
byfn.sh down

 

使用脚本启动网络的操作如下:

① 进入first-network 目录

cd fabric-samples/first-network   

② 启动网络(该过程包括:启动容器、创建通道、加入通道、更新组织锚节点、打包链码、安装链码、实例化链码、调用链码)

./byfn.sh up -l node -o etcdraft -s couchdb     #安装node语言版本的chaincode_example02的链码,使用Raft排序服务而不是solo,启用couchdb数据库(支持富查询)

# ./byfn.sh up -n -a -o etcdraft -s couchdb   #不安装chaincode_example02的链码,启用CA服务,启用Raft排序服务而不是solo,启用couchdb数据库(支持富查询)

 

等效的手动部署Fabric网络的方式如下(启用CAs,使用couchdb):

Ⅰ 使用cryptogen工具生成证书及密钥,放置于crypto-config目录下

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

Ⅱ 使用configtxgen工具生成4个配置组件(genesis.block,channel.tx,Org1MSPanchors.tx,Org2MSPanchors.tx),放置于 channel-artifacts目录下

① export FABRIC_CFG_PATH=$PWD

② configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block   #生成系统创世区块,默认使用solo排序,channelID是系统通道的名字

# configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block   #使用Raft排序服务

③ export CHANNEL_NAME=mychannel   #通过环境变量设置通道名称

configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME   #创建 通道配置 事务channel.tx

④ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP   #创建 更新组织Org1在该通道上的锚节点 的事务Org1MSPanchors.tx

configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP   #创建 更新组织Org2在该通道上的锚节点 的事务Org2MSPanchors.tx

Ⅲ 创建通道,将peer节点加入通道,并更新组织的锚节点

① docker-compose -f docker-compose-cli.yaml up -d   #不启用CA,不启动couchDB
#docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d   启用couchdb

② docker exec -it cli bash   #进入CLI容器

配置环境变量,以使CLI容器作为peer0.org1.example.com节点执行命令,后续很多操作需要不断地切换这组环境变量,以作为不同的peer节点执行相关操作,节点peer0.org1.example.com的环境变量已默认配置在cli容器中,peer0.org1.example.com的环境变量如下,

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

③ 将通道配置事务发送给order节点以创建通道

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

④ 切换环境变量,多次执行以下命令,将所有节点加入通道

peer channel join -b mychannel.block

⑤ 切换环境变量,多次执行以下命令,更新组织锚节点

peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.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

Ⅲ 安装、实例化链码(实例化时,node及java耗时较长,执行init或者其他交易才能导致链码容器的启动),以chaincode_example02链码为例

① 切换环境变量,多次执行以下命令,在不同节点安装链码

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

peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/chaincode_example02/node/ #Node.js

peer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/ #Java

② 切换环境变量,多次执行以下命令,在不同节点实例化链码

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')" #Golang

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 -l node -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')" #Node.js

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 -l java -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')" #Java

③ 查询键‘a’在状态数据库的Value

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

④ 调用‘invoke’函数,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"]}'

Fabric的默认状态数据库为levelDB,levelDB仅支持通过KEY来查询数据,而couchdb支持使用富查询,即可根据Value的某个属性进行查询,marbles02案例演示了链码中如何使用富查询,在此对marbles02案例的链码进行测试(使用docker compose网络容器时,添加上couchdb对应的yaml文件,其余步骤与上述完全相同)

docker exec -it cli bash   #进入CLI容器

export CHANNEL_NAME=mychannel   #通道名称

① 安装、实例化链码(在此通过-l node安装并实例化node语言版本链码,默认为go且go版本链码-p只需指定相对路径github.com/chaincode/marbles02/go)(背书策略在此指定为"OR ('Org1MSP.peer','Org2MSP.peer')",因此只在peer0.org1.example.com上安装并实例化链码即可)

peer chaincode install -n marbles -l node -v 1.0 -p /opt/gopath/src/github.com/chaincode/marbles02/node

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 marbles -l node -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"

② 创建一些弹珠并转移它们(可在浏览器中输入http://localhost:5984/_utils查看couchdb数据库状态)

peer chaincode invoke -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 marbles -c '{"Args":["initMarble","marble1","blue","35","tom"]}' peer chaincode invoke -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 marbles -c '{"Args":["initMarble","marble2","red","50","tom"]}' peer chaincode invoke -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 marbles -c '{"Args":["initMarble","marble3","blue","70","tom"]}' peer chaincode invoke -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 marbles -c '{"Args":["transferMarble","marble2","jerry"]}' peer chaincode invoke -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 marbles -c '{"Args":["transferMarblesBasedOnColor","blue","jerry"]}' peer chaincode invoke -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 marbles -c '{"Args":["delete","marble1"]}'

③ 查询

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["readMarble","marble2"]}' #通过名字查询marble2弹珠

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["getHistoryForMarble","marble1"]}' #检索特定弹珠的历史

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["queryMarblesByOwner","jerry"]}' #还可以对数据内容执行富查询,例如按所有者查询弹珠

 

其他:

① 链码升级:修改版本号后,在节点上再次安装链码:

peer chaincode install -n elecData -l node -v 1.1 -p /opt/gopath/src/github.com/chaincode/always/ElecData

升级命令和实例化命令基本相同,只需将instantiate改为upgrade

peer chaincode upgrade -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 elecData -l node -v 1.1 -c '{"Args":["instantiate"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"

 ② 查看日志:

docker logs -f cli     #通过cli容器日志查看网络中的事务信息

docker logs 链码容器    #查看链码日志命令格式

③ FabricV1.4官方JS链码网址

https://hyperledger.github.io/fabric-chaincode-node/release-1.4/api/
https://github.com/hyperledger/fabric-chaincode-node/tree/v1.4.5
https://hyperledger.github.io/fabric-chaincode-node/

④ Fabric官方JS SDK1.4网址
https://github.com/hyperledger/fabric-sdk-node
https://hyperledger.github.io/fabric-sdk-node/release-1.4/index.html

⑤ fabric-samples地址:https://github.com/hyperledger/fabric-samples

⑥ V1.4二进制文件及镜像安装脚本命令:curl -sSL http://bit.ly/2ysbOFE | bash -s -- 1.4.6 1.4.6 0.4.18

单纯的curl -sSL http://bit.ly/2ysbOFE | bash -s总是默认安装当前最新版本,因此需要指定1.4的版本号

 

 

 

 

posted on 2020-03-26 03:53  always-kaixuan  阅读(788)  评论(0编辑  收藏  举报