test-network 文件夹
在Hyperleger Fabric【2.x】环境搭建(一)我们已经完成了相关环境搭建和测试工作。现在开始使用官方给出的例子完整的运行一下吧。
官方示例:
- 启动网络
- 创建通道
- 启动链码
- 调用链码
- 关闭网络
我们进入我们的工程文件夹:
cd test-network
ls
关掉之前存在的网络。
./network.sh down
确保没有其他启动的docker干扰。
启动网络
./network.sh up
启动成功之后,我们一点点分析了一下这个过程。
这里面不得不提到刚才下载额二进制文件,我们根据日志内容可以看到,启动过程寻找了
../bin/configtxgen
这个工具。
这个工具作用是根据配置文件生成拓扑结构和身份证书。
配置文件在哪里呢?日志中已经给出了答案。
根据日志描述,我们可以知道,启动这个过程使用到了configtxgen工具,这个工具通过上面的三个配置文件,生成了网络拓扑以及身份证书。
这部分之后再做分析。先继续下一步
现在我们已经搭建好了环境并且运行了一下示例。
创建通道
./network.sh createChannel
默认的通道名称为 mychannel
关于这部分之后在做分析,先进行下一步。
启动链码
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
这里面启动系统自带的示例asset-transfer-basic
go语言版本。
调用链码
这里面调用是通过将 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_FILE
和CORE_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
。