(三)HyperLedger Fabric 2.4 test-network搭建测试网络

本文默认HyperLedger Fabric 2.4 环境已经搭好且启动 test-network 网络测试完成。

如果在启动 test-network 网络测试的过程中出现错误问题,可参考我这篇博客:

(二)HyperLedger Fabric 2.4 test-network启动测试网络时遇到的问题_烟敛寒林的博客-CSDN博客

如果是环境还没搭好或者基本工具还未安装的可参考我这篇博客:

(一)HyperLedger Fabric 2.4 环境搭建_烟敛寒林的博客-CSDN博客 

一、开启测试网络

首先进入到test-network路径下:

cd fabric-samples/test-network

启动测试网络 :

./network.sh up

测试网络由两个peer节点,一个order节点组成,当我们进行测试网络部署时,不会有channel被建立。

此时查看docker容器:

docker ps

如图,可以看到当前运行的三个Docker容器就是由刚才的up命令创建的:

每个与Fabric网络交互的节点需要属于一个作为网络成员的组织,这些组织所组成的组被称为consortium(联盟),这个测试网络有两个联盟成员Org1和Org2,还有一个为网络提供排序服务的排序组织

Peers是Fabric网络的基础组件,它存储区块链的账本,并在交易提交到账本之前验证交易,Peers也运行包含着业务逻辑的智能合约,由此来管理账本上的资产。

网络中的每个Peer都属于联盟的一个成员,在测试网络中peer0.org1.example.com和peer0.org2.example.com各有一个peer。

每个Fabric网络也包含一个排序服务,用于将交易进行排序,这样可以让peer节点专注于验证交易和提交到账本。

在order节点收到来自客户端的交易之后,会按照顺序添加到一个块中,然后分发到各个peer中,加入区块链账本。此外order节点还可以操作系统的channel,定义哪些组织是联盟成员。

测试网络中用了一个Raft排序节点来提供排序服务,这个节点所属组织为orderer.example.com,在测试网络中只有一个order节点,但是在真实的网络中,可能会有被多个组织操作的多个排序节点,不同的排序节点会利用Raft共识算法在网络中来达成交易的一致。

二、创建Channel

Channel是一个用于特定网络成员之间通信的私有层,只有被邀请加入Channel的成员才能够使用它,对网络中其他成员不可见,每个Channel都有一个单独的区块链账本,被邀请加入Channel的peer可以存储Channel的账本然后验证Channel的交易。

(1)运行如下命令可以创建一个名为mychannel(默认通道名)的Channel连接Org1和Org2。

./network.sh createChannel

出现如下错误:

scripts/createChannel.sh:行40: osnadmin: 未找到命令
Channel creation failed 

错误原因:

原因尚未可知,据网上查阅,好像因为我本地安装的时Fabric2.4版本,而拉去的fabric-samples是2.2版本,后续版本有个新改动,所以会引起错误。

解决方法:

把拉去的fabric-samples也换成2.4版本。

如图,创建成功。

(2)也可以利用-c来自定义Channel的名称,通过指定不同的名称可以创建多个Channel。

./network.sh createChannel -c channel1

(3)如果想要在启动测试网络的同时创建Channel,可以同时使用up和createChannel两个参数。

./network.sh up createChannel

三、下载go依赖

正常来说下一步应该部署链码,但此时链码所在路径还缺少go依赖,所以我们要获取依赖。

在正式获取依赖之前,先要更改go env设置。使用下面两个命令:

export GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

此时就把go proxy切换成中国代理,这样才能下载vendor依赖。

查看是否切换成功:

go env

出现跟下图一样的就是成功了:

进入链码所在路径(测试用例的链码路径如下)

cd /opt/app/go/fabric/scripts/fabric-samples/asset-transfer-basic/chaincode-go

下载依赖:

go mod vendor

成功后在链码路径会出现vendor文件夹,完成。

四、在通道上启动链码chaincode(智能合约)

在创建channel之后,可以使用智能合约来和channel的账本交互,运行在网络成员上的应用可以调用智能合约来改变账本上的资产,也可以查询智能合约来读取账本上的数据。

多重签名用于保证利用智能合约创建的交易的有效性,在提交到账本之前,智能合约会被多个组织签名,这样可以防止一个组织篡改账本,只有交易是连续的,而且被足够多的组织签名之后,才会提交到账本中。指明channel中组织的策略也是chaincode定义的部分。

在Fabric中,智能合约以chaincode的形式部署在网络中,一个智能合约会安装在一个组织的peers中,之后才能部署在Channel中,这样才可以用于区块链账本交互和交易,Channel中的成员需要同意chaincode中的定义,这些定义建立了chaincode的治理,只有足够多的成员同意了定义,才能将这个定义提交到channel中,来进行使用。

(1)使用network.sh创建通道之后,可以使用以下命令在通道上启动链码(默认使用go语言),记得切换回 /fabric-samples/test-network 目录: 

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

ccn代表链码名称,ccp代表链码路径,ccl代表链码的编程语言。 

如图,启动成功:

五、与网络交互

当测试网络成功启动之后,可以利用命令行的peer命令与网络交互,它允许用户调用部署好的智能合约,更新channel或者安装和部署新的智能合约。

首先确保自己位于test-network目录下。

进入CLI容器,进行invoke交互,需要几行命令设置CLI的路径:

export PATH=${PWD}/../bin:$PATH

export FABRIC_CFG_PATH=$PWD/../config/

先设置为org1的环境变量进行交互:

export CORE_PEER_TLS_ENABLED=true
 
export CORE_PEER_LOCALMSPID="Org1MSP"
 
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
 
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
 
export CORE_PEER_ADDRESS=localhost:7051

用下面的命令初始化账本:

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'

成功: 

使用下面的命令查找账本:

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

成功后返回:

[{"AppraisedValue":300,"Color":"blue","ID":"asset1","Owner":"Tomoko","Size":5},{"AppraisedValue":400,"Color":"red","ID":"asset2","Owner":"Brad","Size":5},{"AppraisedValue":500,"Color":"green","ID":"asset3","Owner":"Jin Soo","Size":10},{"AppraisedValue":600,"Color":"yellow","ID":"asset4","Owner":"Max","Size":10},{"AppraisedValue":700,"Color":"black","ID":"asset5","Owner":"Adriana","Size":15},{"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Michel","Size":15}]

通过命令改变一笔资产的所有者:

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'

成功后如图:

接下来可以更换成org2的环境变量:

export CORE_PEER_TLS_ENABLED=true
 
export CORE_PEER_LOCALMSPID="Org2MSP"
 
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
 
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/[email protected]/msp
 
export CORE_PEER_ADDRESS=localhost:9051

查询账本:

peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'

成功后返回: 

六、关闭测试网络

./network.sh down

Guess you like

Origin blog.csdn.net/dyw_666666/article/details/122244628