本文默认HyperLedger Fabric 2.x 环境已经搭好且启动 test-network 网络测试完成。
如果在启动 test-network 网络测试的过程中出现错误问题,可参考我这篇博客:
(二)HyperLedger Fabric 2.x test-network启动测试网络时遇到的问题_烟敛寒林的博客-CSDN博客
如果是环境还没搭好或者基本工具还未安装的可参考我这篇博客:
(一)HyperLedger Fabric 2.x 环境搭建_烟敛寒林的博客-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的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 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文件夹,完成。
在创建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