编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

手把手教你运行Fabric网络(fabric network)

wxchong 2024-09-16 07:05:04 开源技术 10 ℃ 0 评论

前言

在这一节,我们将尝试运行Fabric网络。很多语言第一次运行都是Hello World的demo。不过这一次有点区别,我们既可以使用官方提供的工具运行代码,也可以手动运行。准备好了吗?让我们开始吧。

这篇文章是我的同门师兄弟写的,比较详细,分享给大家。他的博客有很多干货,欢迎围观。

http://zhayujie.xyz/category/fabric

准备

1.环境部署

包括需要的软件环境以及docker镜像,如果你还没有配置,参考这篇文章。Fabric在Ubutu上的部署

2.fabric-samples下载

从github上克隆fabric-samples(v1.1):

mkdir -p ~/go/src/github.com/hyperledger // 如果没有该目录需要创建
cd ~/go/src/github.com/hyperledger
git clone -b master https://github.com/hyperledger/fabric-samples.git
cd fabric-samples

3.二进制工具下载

下载地址:https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric

选择合适的版本下载,将解压后的bin目录放置于fabric-samples目录下,并加入环境变量:

vim ~/.bash_profile // Ubuntu中是.profile
添加:export PATH=$HOME/hyperledger/fabric-samples/bin:$PATHsh

使用脚本自动运行

1.生成网络配置信息

该命令利用cryptogen和configtxgen工具生成网络成员的证书和秘钥,排序服务创世区块,通道配置交易,并且更新Org1和Org2的锚节点。

cd ~/hyperledger/fabric-samples/first-network
./byfn.sh -m generate

2.启动网络

该步完成的操作有:启动网络所有节点,创建通道后将节点加入,安装、实例化chaincode,然后进行一系列查询和交易。

./byfn.sh -m up

3.关闭网络

该命令会删除所有容器、生成的配置文件以及chaincode镜像。

./byfn.sh -m down

手动分步运行

为了更好理解fabric网络创建的具体过程,可以手动一步步完成上述脚本中包含的所有操作。

一.生成配置文件

1.生成证书

当前路径位于first-network目录下,运行以下命令会根据crypto-config.yaml配置文件生成crypto-config目录(MSP目录,包含成员的证书和私钥):

// 如果已加入环境变量可直接执行cryptogen generate
../bin/cryptogen generate --config=./crypto-config.yaml

2.生成创世区块

会创建channel-artifacts目录,并在该目录下生成genesis.block,创世区块用于启动网络中的排序节点。

export FABRIC_CFG_PATH=$PWD // 需指明configtx.yaml的路径
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

3.生成通道配置交易

该步会在channel-artifacts目录下生成channel.tx,该通道配置交易会在创建通道时从本地读取发送给orderer节点。

export CHANNEL_NAME=mychannel // 设置通道名称
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

4.生成锚节点配置交易

锚节点(anchor peer),用于不同组织间的gossip通信(区块同步)。该步会在channel-artifacts目录下生成Org1MSPanchors.tx和Org2MSPanchors.tx,这两个配置交易会在设置锚节点时使用。

../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

二.启动网络

1.启动节点容器

运行之前需要修改docker-compose-cli.yaml文件,注释掉cli容器部分的一行配置:

command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME} ${DELAY}; sleep $TIMEOUT'

因为该行命令会使cli容器在运行的时候自动执行script.sh脚本,自动完成所有操作,而这里我们选择手动执行,所以将其注释即可。

启动网络中所有节点:

docker-compose -f docker-compose-cli.yaml up -d

2.创建channel

注意:CLI容器默认连接的是peer0.org1.example.com,操作所需要的环境变量已经设置好了,但如果需要对其他peer或者orderer节点进行操作,则需要重新设置这些环境变量。

首先进入cli容器中,之后的所有命令都是在该容器内部进行的:

docker exec -it cli bash

执行以下命令创建通道,其中--cafile参数制定了orderer节点的TLS根CA证书的路径,用于TLS传输的验证。

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

3.加入通道

创建通道命令会在cli容器中生成一个<channel-ID.block>,在这里是mychannel.block,这是通道创世区块,是该channel内每个节点链上的第一个区块,join channel操作会将该区块发送给指定节点。

现将节点peer0.org1.example.com加入channel:

peer channel join -b mychannel.block

当需要加入其它节点的时候,需要修改环境变量(包括该节点的ip:port,证书路径等),这里以加入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:7051 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

4.安装链码

chaincode在cli容器内部的路径为(安装时以实际路径为准):

github.com/chaincode/chaincode_example02/go/chaincode_example02.go

执行命令将链码文件安装到指定peer节点的文件系统中(这里只在peer0.example.org1.com安装了):

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

5.实例化链码

实例化链码的操作是channel层面上的,会将channel和该chaincode绑定起来,一份链码的实例化在一个通道上只能执行一次。对于指定的目标节点会生成chaincode镜像并运行该容器,而通道内其它安装了链码的节点则会在指定该节点查询或交易时自动生成镜像和容器。

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 "OR ('Org1MSP.member','Org2MSP.member')"

其中-p参数设置了背书策略,这里是OR ('Org1MSP.member','Org2MSP.member'),表示交易需要Org1或Org2中的任意一个peer进行一次背书,该交易就是有效的。

-c参数表示将调用链码的init接口,将a、b的值分别设置为100和200。

6.查询

查询a的值,这里假设cli的环境变量连接的仍是peer0.org1.example.com:

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

查询结果为:

Query Result:100

7.交易

从a账户转移10个数额到b账户,该步会发送交易到orderer节点,在区块链中添加新的区块,并更新至状态数据库。

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 mycc -c '{"Args":["invoke","a","b","10"]}'

完成交易后,可以指定不同节点再次查询a的数值,可以得到结果为90,表明不同peer的账本数据是互相同步的。

结束语

恭喜你,相信你通过本篇文章掌握了运行Fabric网络的方法,也有点小小的成就感了吧,在接下来的文章中,我将为大家带来更多的文章。

如果您认为我的文章对您有帮助,欢迎关注我的头条号「BlockChainDeveloper」。

您的支持是对我的最大的鼓励。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表