HyperledgerFabricV2.0(五)手动搭建Fabric网络(基于first-。。。

在线日程
HyperledgerFabricV2.0(五)⼿动搭建Fabric⽹络(基于first-。。。
如果还不具备Hyperledger Fabric V2.0的完整环境,请参考:。在具备基础环境后,便可进⾏Fabric⽹络的部署⼯作。可以参照官⽹⽂档关于first-network案例的部分,使⽤提供的脚本⽂件快速启动区块链⽹络。但为了搭建⾃定义的Fabric⽹络,需要掌握脚本所执⾏的具体操作。
脚本部署Fabric⽹络的⽅式如下(启⽤CAs,使⽤couchdb):
Ⅰ cd fabric-samples/first-network  #进⼊fabric-samples/first-network⽬录
Ⅱ ./byfn.sh down  #若已经进⾏过部署,则销毁已有⽹络;若第⼀次部署,则忽略该步骤
Ⅲ ./byfn.sh up -a -n -s couchdb  #参数-a启动证书颁发机构,-n不部署abstore链码(脚本默认部署该链码),-s使⽤couchdb数据库⽽不是goleveldb ,关于该脚本的详细使⽤帮助可通过./byfn.sh -h查看
等效的⼿动部署Fabric⽹络的⽅式如下(启⽤CAs,使⽤couchdb):
Ⅰ为⽹络中的实体⽣成证书及密钥,⽣成联盟通道配置组件,启动Fabric⽹络
cd fabric-samples/first-network  #进⼊fabric-samples/first-network⽬录
①使⽤cryptogen⼯具⽣成证书及密钥,放置于crypto-config⽬录下
真空集热管cryptogen generate --config=./crypto-config.yaml  #byfn.sh脚本中的generateCerts()函数调⽤cryptogen⼯具后,还调⽤了同⼀⽬录下的ccp-generate.sh脚本为Org1和Org2⽣成CCP⽂件(供后期SDK使⽤),在此先忽略
②使⽤configtxgen⼯具⽣成4个配置组件(genesis.block,,,),放置于 channel-artifacts⽬录下
export FABRIC_CFG_PATH=$PWD  #告诉configtxgen从哪⾥寻configtx.yaml⽂件
configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block  #⽣成系统通道创世区块genesis.block
export CHANNEL_NAME=mychannel  #通过环境变量指定通道名称
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./ -channelID $CHANNEL_NAME  #创建通道配置事务
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPancho
< -channelID $CHANNEL_NAME -asOrg Org1MSP  #创建更新组织Org1在该通道上的锚节点的事务
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./ -channelID $CHANNEL_NAME -asOrg Org2MSP  #创建更新组织Org2在该通道上的锚节点的事务
防卫器
结果如下:
③使⽤docker compose基于yaml配置⽂件启动容器,建⽴Fabric⽹络(使⽤CAs与couchdb)
export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/ample/ca && ls *_sk)  #以环境变量的形式指定每个组织的CA的私钥,CA节点的yaml配置⽂件中会使⽤该变量
export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/ample/ca && ls *_sk)
docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml -f docker-compose-c
a.yaml -f docker-compose-couch.yaml up -d  #参数-d⽤于不显⽰实时⽇志,若想查看⽇志流,后续命令则需要打开另⼀个终端来执⾏
docker ps  #查看已启动容器的基本信息,包括⼀个cli,四个peer,四个couchdb,五个order,两个ca
docker network inspect net_byfn  #可查看⽹络信息
Ⅱ创建通道,将peer节点加⼊通道,并更新组织的锚节点
docker exec -it cli bash  #进⼊CLI(命令⾏)容器气动压线钳
配置环境变量,以使CLI容器作为ample节点执⾏命令,后续很多操作需要不断地切换这组环境变量,以作为不同的peer节点执⾏相关操作,节点
<1.example的环境变量如下:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/users/ample/msp CORE_PEER_1.example:7051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/1.example/ 为了便于查看,在此也先给出节点ample的环境变量:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/users/ample/msp CORE_PEER_2.example:9051
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/2.example/ ①将通道配置事务发送给order节点以创建通道
export CHANNEL_NAME=mychannel  #以环境变量形式指定通道名称,必须全部⼩写
peer channel create -ample:7050 -c $CHANNEL_NAME -f ./ --tls true --cafile
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ordererOrganizations/example/ample/msp/ample-cert.pem  #若通道创建成功,将接收到来⾃order节点的通道的创世区块,以通道名称命名
②切换peer节点的环境变量,多次执⾏以下命令,将节点加⼊通道
peer channel join -b $CHANNEL_NAME.block  #命令中的$CHANNEL_NAME.block,根据通道名称⽽变化
③切换peer节点的环境变量,多次执⾏以下命令,为每个组织指定其在当前通道中的锚节点,每个组织⾄少有⼀个锚节点
peer channel update -ample:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_ --tls true --cafile
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ordererOrganizations/example/ample/msp/ample-cert.pem  #为组织指定锚节点
⾄此./byfn.sh up -a -n -s couchdb所执⾏的所有⼯作均通过⼿动操作实现,若去掉参数-n,该脚本将会继续执⾏abstore链码的部署与测试⼯作,同样可以纯⼿动完成任何链码的部署与测试。
Ⅲ链码的打包、安装、定义、提交与调⽤测试等部署过程如下(在此以abstore为例,也可使⽤⾃⼰编写的链码):
①打包链码(以java语⾔为例,node可通过--lang node指定,go语⾔稍有不同,请参考官⽹⽂档)。脚本中命令格式为peer lifecycle chaincode package --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label mycc_${VERSION}),mycc为链码名称(可⾃定义),参数--lang指定链码使⽤的编程语⾔,--label指定链码标签(通常采⽤名称_版本的格式),--path指定链码的存储路径,docker-compose-cli.yaml⽂件中有卷的映射关系./../chaincode/:/opt/gopath/src/github/hyperledger/fabric-samples/chaincode,因此主机的fabric-samples/chaincode⽬录对应着peer容器的/opt/gopath/src/github/hyperledger/fabric-samples/chaincode⽬录
peer lifecycle chaincode package --path /opt/gopath/src/github/hyperledger/fabric-samples/chaincode/abstore/java/ --lang java --label mycc_1  #⼀定要根据⾃⼰链码的实际存储位置,修改 --path的值,⽬录对应关系见上述
②切换peer节点的环境变量,多次执⾏以下命令,在不同节点安装链码
peer lifecycle chaincode install   #注意链码包名称与前⼀条命令保持⼀致,该
命令执⾏期间很容易报错Error: failed to endorse chaincode install: rpc error: code = Unavailable desc = transport is closing,原因未知。解决⽅案:稍等两分钟,再次执⾏命令(⾼频率重复执⾏命令将引起其它错误),⼀般第⼆次就会成功
③查询节点上已安装的链码,将链码ID设置为环境变量(后续命令会⽤到)
peer lifecycle chaincode queryinstalled  #可看到已安装链码包的ID以及标签
CC_PACKAGE_ID=mycc_1:3a8c52d70c36313cfebbaf09d8616e7a6318ababa01c7cbe40603c373bcfe173  #这个ID是动态的,不要直接复制此命令
④切换peer节点的环境变量,多次执⾏以下命令,所有组织就链码定义达成⼀致(只需要每个组织的
某个peer执⾏⼀次)
peer lifecycle chaincode approveformyorg --channelID $CHANNEL_NAME --name mycc --version 1.0 --init-required --package-id $CC_PACKAGE_ID --sequence 1 --tls true --cafile /opt/gopath/src/github/hyperledger/fabric/peer/crypto/ordererOrganizations/example/ample/msp/ample-cert.pem  #官⽅脚本中--version和--sequence的值⼀致,不太清楚两个值的差别
陶瓷过滤器
⑤检查组织是否就链码定义已经达成⼀致
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name mycc --version 1.0 --init-required --sequence 1 --tls true --cafile
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ordererOrganizations/example/ample/msp/ample-cert.pem --output json  #查看各组织对链码定义的批准状况
⑥将链码定义提交到通道(任何组织的某个节点执⾏⼀次即可)
peer lifecycle chaincode commit -ample:7050 --channelID $CHANNEL_NAME --name mycc --version 1.0 --sequence 1 --init-required --tls true --cafile
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ordererOrganizations/example/ample/msp/ample-cert.pem --1.example:7051 --tlsRootCertFiles
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/1.example/ --peerAddresses
<2.example:9051 --tlsRootCertFiles
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/2.example/
⑦查询链码定义
peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name mycc
⑧调⽤链码的初始化函数
peer chaincode invoke -ample:7050 --isInit --tls true --cafile
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ordererOrganizations/example/ample/msp/ample-cert.pem -C $CHANNEL_NAME -n mycc --1.example:7051 --tlsRootCertFiles
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/1.example/ --peerAddresses
<2.example:9051 --tlsRootCertFiles
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/2.example/ -c '{"Args":["Init","a","100","b","100"]}' --waitForEvent  #-c指定调⽤链码函数的参数,请根据⾃⼰的链码进⾏修改(第⼀个参数为函数名)
⑨调⽤链码的查询(query)函数
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'  #-c指定调⽤链码函数的参数,请根据⾃⼰的链码进⾏修改(第⼀个参数为函数名)
⑩调⽤链码的invoke函数,a向b转账⼗元,该事务提交后,再次查询a的值将为90
peer chaincode invoke -ample:7050 --tls true --cafile
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ordererOrganizations/example/ample/msp/ample-cert.pem -C $CHANNEL_NAME -n mycc --1.example:7051 --tlsRootCertFiles
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/1.example/ -ca1703
-peerAddresses
<2.example:9051 --tlsRootCertFiles
/opt/gopath/src/github/hyperledger/fabric/peer/crypto/ample/2.example/ -c '{"Args":["invoke","a","b","10"]}' --waitForEvent  #-c指定调⽤链码函数的参数,请根据⾃⼰的链码进⾏修改(第⼀个参数为函数名)
⾄此,Fabric⽹络已经通过⼿动⽅式完成部署,可通过执⾏./byfn.sh down来销毁该⽹络。若想根据具体实际需求⾃定义⽹络的成员组织或组织中节点的数量,则需要修改crypto-config.yaml、configtx.yaml以及启动docker容器的yaml配置⽂件。关于first-network案例使⽤到的配置⽂件的简介,请参照。

本文发布于:2024-09-23 15:29:29,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/178320.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:链码   节点   通道   组织   命令   定义   指定
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议