Hyperleger Fabric【2.x】运行示例(二)

478 阅读3分钟

test-network 文件夹

在Hyperleger Fabric【2.x】环境搭建(一)我们已经完成了相关环境搭建和测试工作。现在开始使用官方给出的例子完整的运行一下吧。

官方示例:

  • 启动网络
  • 创建通道
  • 启动链码
  • 调用链码
  • 关闭网络

我们进入我们的工程文件夹:

image.png

cd test-network
ls

关掉之前存在的网络。

./network.sh down

image.png 确保没有其他启动的docker干扰。

image.png

启动网络

./network.sh up

image.png

启动成功之后,我们一点点分析了一下这个过程。

image.png

这里面不得不提到刚才下载额二进制文件,我们根据日志内容可以看到,启动过程寻找了 ../bin/configtxgen这个工具。

这个工具作用是根据配置文件生成拓扑结构和身份证书。

配置文件在哪里呢?日志中已经给出了答案。

image.png 根据日志描述,我们可以知道,启动这个过程使用到了configtxgen工具,这个工具通过上面的三个配置文件,生成了网络拓扑以及身份证书。

这部分之后再做分析。先继续下一步

现在我们已经搭建好了环境并且运行了一下示例。

创建通道

./network.sh createChannel

默认的通道名称为 mychannel

image.png

关于这部分之后在做分析,先进行下一步。

启动链码

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

这里面启动系统自带的示例asset-transfer-basicgo语言版本。

调用链码

这里面调用是通过将 peer cli 。我们可以认为是客户端调用,调用之前先配置环境变量,目的是为了减少调用时特别长的命令,以及切换身份。

先将上层目录下面的的/bin配置到环境变量里面,还记得之前配置环境的时候下载两个压缩包吗,就是那里面的可执行文件。

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

您还需要将fabric-samples代码库中的FABRIC_CFG_PATH设置为指向其中的core.yaml文件:

export FABRIC_CFG_PATH=$PWD/../config/

现在,您可以设置环境变量,以允许您作为Org1操作peer CLI:

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

CORE_PEER_TLS_ROOTCERT_FILECORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的的加密材料。 如果您使用 ./network.sh deployCC -ccl go 安装和启动 asset-transfer (basic) 链码,您可以调用链码(Go)的 InitLedger 方法来赋予一些账本上的初始资产

运行以下命令用一些资产来初始化账本

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":[]}'

如果命令成功,您将观察到类似以下的输出:

-> INFO 001 Chaincode invoke successful. result: status:200

现在你可以用你的 CLI 工具来查询账本。运行以下指令来获取添加到通道账本的资产列表:

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

如果成功,您将看到以下输出:

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

当一个网络成员希望在账本上转一些或者改变一些资产,链码会被调用。使用以下的指令来通过调用 asset-transfer (basic) 链码改变账本上的资产所有者:

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"]}'

如果命令成功,您应该看到以下响应:

2019-12-04 17:38:21.048 EST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

因为 asset-transfer (basic) 链码的背书策略需要交易同时被 Org1 和 Org2 签名,链码调用指令需要使用 --peerAddresses 标签来指向 peer0.org1.example.com 和 peer0.org2.example.com。因为网络的 TLS 被开启,指令也需要用 --tlsRootCertFiles 标签指向每个 peer 节点的 TLS 证书。

调用链码之后,我们可以使用另一个查询来查看调用如何改变了区块链账本的资产。因为我们已经查询了 Org1 的 peer,我们可以把这个查询链码的机会通过 Org2 的 peer 来运行。设置以下的环境变量来操作 Org2:

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

你可以查询运行在 peer0.org2.example.com asset-transfer (basic) 链码:

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

结果显示 "asset6" 转给了 Christopher:

{"ID":"asset6","color":"white","size":15,"owner":"Christopher","appraisedValue":800}

关停网络

使用完测试网络后,您可以使用以下命令关闭网络:

./network.sh down

该命令将停止并删除节点和链码容器,删除组织加密材料,并从Docker Registry移除链码镜像。 该命令还删除之前运行的通道项目和docker卷。如果您遇到任何问题,还允许您再次运行./ network.sh up