Hyperledger Fabric(二)运行测试网络(test-network)
测试网络用于测试本地Fabric环境是否正常,过程如下:
① cd fabric-samples/test-network #进入test-network目录下,关键脚本network.sh包含了启动网络,创建通道,销毁网络等功能,./network.sh -h可查看详细信息
② ./network.sh up #以默认选项启动网络,创建一个由两个peer节点(属于两个组织)和一个order节点组成的网络,可通过 docker ps -a 查看启动的容器
./network.sh up -ca #使用Fabric CAs启动网络,证书将由CA生成,而不是cryptogen,该命令将生成三个CA(每个组织一个),ca_org1,ca_org2,ca_orderer。然后脚本使用Fabric CA客户端注册属于每个组织的用户,并为每个身份生成证书和密钥,可查看registerEnroll.sh脚本的内容(在organizations/fabric-ca目录下)
③ ./network.sh createChannel #创建Org1和Org2之间的通道,默认名称mychannel,也可指定通道名称
注:./network.sh createChannel -c channel1 #-c指定通道名称,可通过不同名称创建多个不同的通道
./network.sh up createChannel #以上两条指令也可合并为一条执行,启动网络并创建通道
④ ./network.sh deployCC #在peer0.org1.example.com和peer0.org2.example.com上安装链码并在通道上部署fabcar chaincode,并执行初始化,查询等操作
⑤ ./network.sh down #销毁网络(从而可再次运行./network.sh up),该命令将停止并删除节点与chaincode的容器,删除各个组织的证书文件(organizations子目录下),删除chaincode镜像,删除通道文件(channel-artifacts目录下),删除系统创世区块(system-genesis-block目录下)
过程简析:
./network.sh up做了什么:
①脚本首先会为peer组织和order组织创建证书和密钥,默认使用cryptogen tool,配置文件在organizations/cryptogen目录下,若使用./network.sh up -ca启动,registerEnroll.sh脚本将使用Fabric CA server基于organizations/fabric-ca目录下的配置文件生成证书及密钥
②脚本使用configtxgen tool基于configtx/configtx.yaml配置文件创建系统通道创世区块,并将其存储在system-genesis-block目录下
③脚本使用docker目录下的docker-compose-test-net.yaml启动peer与order节点
./network.sh createChannel做了什么:
该脚本将调用scripts目录下的createChannel.sh,createChannel.sh基于configtx/configtx.yaml使用指定的通道名称创建通道,向通道中加入peer0.org1.example.com和peer0.org2.example.com,并将它们更新为锚节点
./network.sh deployCC做了什么:
该脚本将调用scripts目录下的deployCC.sh,deployCC.sh在peer0.org1.example.com和peer0.org2.example.com上安装fabric的链码,并在通道中定义chaincode,最后调用chaincode显示结果
使用命令行与区块链网络进行交互,此处模拟peer0.org1.example.com节点:
首先,确保当前在test-network目录中
① export FABRIC_CFG_PATH=$PWD/../config/ #指定core.yaml文件
② 设置以下环境变量,从而作为peer0.org1.example.com节点与区块链网络进行交互
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//msp
export CORE_PEER_ADDRESS=localhost:7051
③ peer chaincode query -C mychannel -n fabcar -c ‘{"Args":["queryAllCars"]}‘ #调用chaincode查询,-C指定通道名称,-n指定合约名称,-c指定参数序列(第一个参数为合约函数名)
④ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --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":"changeCarOwner","Args":["CAR9","Dave"]}‘ #调用chaincode更改CAR9的归属者