hyperledger应用-fabcar的运行
一、启动网络
进入工作目录
cd fabric-samples
运行关闭网络脚本以关闭之前运行的容器和创建的内容
./network.sh down
运行脚本创建通道
./network.sh up createChannel
成功启动后会显示如下结果
二、部署链码:打包智能合约
进入链码目录
cd fabric-samples/chaincode/fabcar/go
安装go依赖
GO111MODULE=on go mod vendor
成功后目录下出现vendor文件夹
返回test-network目录
引入bin目录下的二进制文件
export PATH=${PWD}/../bin:$PATH
指明配置文件core.yaml文件路径
export FABRIC_CFG_PATH=$PWD/../config/
检查是否能运行peer CLI
peer version
显示peer版本信息,说明能够正常使用
创建链码包
peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/java/build/install/fabcar --lang java --label fabcar_1
该命令会创建一个fabcar.tar.gz的压缩包
三、部署链码:安装链码
启动网络时创建了Org1和Org2两个组织和他们对应的节点
首先Org1管理员的身份操作CLI,引入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
安装链码
peer lifecycle chaincode install fabcar.tar.gz
peer会编译链码并安装,安装成功后peer会生成并返回package identifier,其中的package ID需要保存,后续会用到。这里的ID是
fabcar_1:1146b4b491871bf18b23dd67dd8cc058655b36cc0e2274f165ed06b796a8f276
注意,不同电脑部署的链码ID可能不同,根据自己的实际情况来
同理以Org2的身份进行操作
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 fabcar.tar.gz
三、部署链码:批准链码定义
链码安装后还需要各节点的认可才能正式部署到链上
可以通过以下命令查询已安装的链码
peer lifecycle chaincode queryinstalled
可以找到我们先前安装的链码ID
由于我们需要通过ID来找到对应的链码,因此需要将ID引入为环境变量
export CC_PACKAGE_ID=fabcar_1:1146b4b491871bf18b23dd67dd8cc058655b36cc0e2274f165ed06b796a8f276
上一步中我们以Org2的身份安装了链码,现在仍以该身份批准链码
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
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 --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
系统会返回同意成员的情况:
{
"Approvals": {
"Org1MSP": true,
"Org2MSP": true
}
}
将链码提交到通道
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/example.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 --channelID mychannel --name fabcar --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
五、链码调用
创建一辆车至账本,由于数据上链需要满足背书策略的要求,因此需要两个组织的节点都同意
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"]}'
调用后返回链上所有汽车的数据
六、链码升级
这里假设Org1和Org2最初安装了Fabcar链码的GO版本,但使用JavaScript编写的链码会更方便。因此通过链码升级来安装Fabcar链码的JavaScript版本
进入链码目录安装JavaScript需要的依赖,再返回工作目录
cd ../chaincode/fabcar/javascript
npm install
cd ../../../test-network
与之前类似,先打包链码
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
peer lifecycle chaincode package fabcar_2.tar.gz --path ../chaincode/fabcar/javascript/ --lang node --label fabcar_2
引入Org1的环境变量,在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
peer lifecycle chaincode install fabcar_2.tar.gz
查询已安装的链码
peer lifecycle chaincode queryinstalled
fabcar_1是之前安装的go版本的链码,fabcar_2是现在安装的JavaScript版本的链码
指明新版本链码的ID
export NEW_CC_PACKAGE_ID=fabcar_2:9482f7c1f9832d3fc8d9352d1cbbd526b928ee1a867defd3488aa5acc65093b3
继续以Org1的身份同意链码安装
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
再以Org2的身份进行相同的操作
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 fabcar_2.tar.gz
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
查询通道中的节点对新版本链码安装的同意情况
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 2.0 --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
由于经过了上述操作,会显示Org1和Org2都同意
{
"Approvals": {
"Org1MSP": true,
"Org2MSP": true
}
}
使用下列命令升级链码
peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 2.0 --sequence 2 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.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 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":"createCar","Args":["CAR11","Honda","Accord","Black","Tom"]}'
查询链上所有车辆的信息
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
系统返回相应信息,证明链码被成功安装和调用
所有内容结束后及时关闭网络
./network.sh down
七、问题报错
Error: failed to normalize chaincode path: 'go list' failed with: : signal: killed Chaincode packaging has failed Deploying chaincode failed
缺乏go的依赖包,没有设置go代理而无法下载
解决方法:设置代理
go env -w GOPROXY=https://goproxy.io,direct
go env -w GO111MODULE=on