hyperledger fabric运行测试(每步代码+结果)


使用以下命令结束之前生成的网络

./network.sh down     

启动测试网络

./network.sh up createChannel   

进入go.mod在fabric-samples/chaincode/fabcar/go目录中

cd /home/lighthouse/fabric/scripts/fabric-samples/chaincode/fabcar/go

 该go.mod文件将Fabric合约API导入到智能合约包中

GO111MODULE=on go mod vendor

返回到test-network所在目录,以便可以将链码与其他网络部件打包在一起

cd ../../../test-network  

所需格式的链码包可以使用peer CLI创建,使用以下命令将这些二进制文件添加到你的CLI路径

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

设置FABRIC_CFG_PATH指向fabric-samples里的core.yaml

export FABRIC_CFG_PATH=$PWD/../config/

使用peer lifecycle chaincode package命令创建链码包

peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_1

命令解释:此命令将在当前目录中创建一个名为basic.tar.gz的软件包。–lang标签用于指定链码语言,–path标签提供智能合约代码的位置,该路径必须是标准路径或相对于当前工作目录的路径,–label标签用于指定一个链码标签,该标签将在安装链码后对其进行标识。建议您的标签包含链码名称和版本。

打包Fabcar智能合约后,我们可以在peer节点上安装链码。需要在将认可交易的每个peer节点上安装链码。因为我们将设置背书策略以要求来自Org1和Org2的背书,所以我们需要在两个组织的peer节点上安装链码:peer0.org1.example.com和peer0.org2.example.com

先在Org1 peer节点上安装链码:

①设置以下环境变量,以Org1管理员的身份操作peer CLI

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/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

②使用 peer lifecycle chaincode install 命令在peer节点上安装链码

peer lifecycle chaincode install fabcar.tar.gz

然后在Org peer2节点安装链码,设置以下环境变量,以Org2管理员的身份操作peer CLI

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_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/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051

使用 peer lifecycle chaincode install 命令在peer节点上安装链码

peer lifecycle chaincode install fabcar.tar.gz

安装链码包后,需要通过组织的链码定义。如果组织已在其peer节点上安装了链码,则他们需要在其组织通过的链码定义中包括包ID。包ID用于将peer节点上安装的链码与通过的链码定义相关联,并允许组织使用链码来认可交易。

使用peer lifecycle chaincode queryinstalled命令来查询peer节点,从而找到链码的包ID

peer lifecycle chaincode queryinstalled

包ID是链码标签和链码二进制文件的哈希值的组合。每个peer节点将生成相同的包ID。通过链码时,我们将使用包ID,因此,将包ID保存为环境变量。将返回的包ID粘贴到下面的命令中。

注意:包ID对于所有用户而言都不相同,因此需要使用上一步中从命令窗口返回的包ID来完成此步骤。而不是直接复制命令。

export CC_PACKAGE_ID=fabcar_1:1146b4b491871bf18b23dd67dd8cc058655b36cc0e2274f165ed06b796a8f276

因为已经设置了环境变量为peer CLI作为Orig2管理员进行操作,所以我们可以以Org2组织级别将Fabcar的链码定义通过。使用 peer lifecycle chaincode approveformyorg命令通过链码定义:

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

设置以下环境变量以Org1管理员身份运行:

export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_ADDRESS=localhost:7051

Org1通过链码定义:

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

将链码提交给通道。使用peer lifecycle chaincode checkcommitreadiness命令来检查通道成员是否已批准相同的链码定义:

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json

该命令将生成一个JSON映射,该映射显示通道成员是否批准了checkcommitreadiness命令中指定的参数:

由于作为通道成员的两个组织都同意了相同的参数,因此链码定义已准备好提交给通道。你可以使用peer lifecycle chaincode commit命令将链码定义提交到通道。commit命令还需要由组织管理员提交。命令成功执行,应该能够得到类似于以下的响应:

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/exam命令成功执行,应该能够得到类似于以下的响应:ple.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --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

可以使用peer lifecycle chaincode querycommitted命令来确认链码定义已提交给通道。

peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

如果将链码成功提交给通道,该querycommitted命令将返回链码定义的顺序和版本:

调用链码:

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 fabcar --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 fabcar -c '{"Args":["queryAllCars"]}'

对查询的响应应为以下汽车列表:

可以通过从test-network目录发出以下命令来关闭测试网络:

./network.sh down

本文主要参考:https://blog.csdn.net/mutou___/article/details/110039475