前言
最近要基于BSN(区块链服务网络)进行区块链开发,如果你还不知道什么是BSN的话,这是BSN官方的介绍:
区块链服务网络(Blockchain-based Service Network)(以下称为“服务网络”或“BSN”)是一个跨云服务、跨门户、跨底层框架,用于部署和运行区块链应用的全球性公共基础设施网络,由国家信息中心、中国移动通信集团公司、中国银联股份有限公司、北京红枣科技有限公司共同发起。互联网是通过TCP/IP协议将属于各方的云资源和数据中心连接而形成的,BSN则是通过一套区块链环境协议将属于各方的云资源和数据中心连接而组成。两者均不属于任何单一组织,都是公共基础设施。
由于BSN目前还没有提供开发环境,因此只能自己搭建开发和测试环境。
我们直接使用Fabricr提供的测试环境作为开发和测试的环境,至于怎么下载和运行Fabric测试网络,可以看我另一个教程:win10下Hyperledger Fabric入门教程
启动测试网络
打开git base工具,执行下面的命令启动了一个带mychannel名的通道的测试网络,并设置好的环境变量。
`
# 启动测试网络
cd $GOPATH/src/github.com/hyperledger/fabric-samples/test-network
./network.sh down
./network.sh up
./network.sh createChannel
#设置经常要使用的环境变量
export PATH=${PWD}/../bin:${PWD}:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
export CORE_PEER_TLS_ENABLED=true
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
export PEER0_ORG1_CA=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export PEER0_ORG2_CA=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
# 使用默认的通道名称
export CHANNEL_NAME=mychannel
# 切换到组织1的peer节点上
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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
`
部署BSN的链码
下载链码
直接下载代码包:http://www.bsnbase.com/static/base/BaseChainCode.zip
解压后
把bsnBaseCC-node.js目录复制到$GOPATH\src\chaincode下,方便我们后续操作
我们这次要使用的是javascript版本的链码
打包链码
在git base里执行
`
peer lifecycle chaincode package clockin.tar.gz --path $GOPATH/src/chaincode/bsnBaseCC-node.js/ --lang node --label clockin
`
注意,javascript版本的链码的--lang的参数是node而不是javascript
clockin 是我自己起的链码的名字,你们也可以自己随意定义,但下面的需要这个名字的地方都要换成你定义。
该方法只做两件事,一是把代码打包成code.tar.gz压缩包(包名字是固定的),二是在code.tar.gz同目录下创建一个metadata.json文件(文件名也是固定的),把命令里的三个参数保存起来,如
`
{"path":"E:\\go/src/chaincode/bsnBaseCC-node.js/","type":"node","label":"clockin"}
`
最后把code.tar.gz和metadata.json再次打包成clockin.tar.gz,放到目录执行命令的目录下($GOPATH/src/github.com/hyperledger/fabric-samples/test-network)
知道它的原理,我们其实也可以自己手工打包。
在peer节点上安装链码
先在组织1的peer安装,执行安装操作
`
peer lifecycle chaincode install clockin.tar.gz
`
执行成功将得到一个包ID,我们把它保存到环境变量
注:把下面的ID换成你自己的再执行命令
`
export CC_PACKAGE_ID=clockin:0d61c476742be4182cc817ea2b96380aab73f6725d2f4b129074c428a2aff24a
`
再切换到组织2的peer上执行相同的安装操作
`
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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:9051
peer lifecycle chaincode install clockin.tar.gz
`
由于得到的包ID与上面的一样的,因此都使用CC_PACKAGE_ID这个环境变量就行
可以使用下面的命令的查询已经安装到当前peer节点的链码
`
peer lifecycle chaincode queryinstalled
`
设置背书策略
先在当前组织2的peer节点上执行
`
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA --channelID mychannel --name clockin --version 1 --init-required --package-id $CC_PACKAGE_ID --sequence 1
`
查询背书策略是否设置成功
`
peer lifecycle chaincode checkcommitreadiness -C mychannel -n clockin -v 1 --sequence 1 --output json --init-required
`
在官方手册等很多教程在执行checkcommitreadiness都没有提到或加上--init-required这个参数,导致查询出来的结果都是失败的,这个问题困扰了我两天,各种百度都没有答案,最后还是分析Fabric带的test-network的测试网络,跟踪deployCC的执行过程才发现加上它就一切正常了。我想可能是approveformyorg用了--init-required这个参数,那下面查询也一定要带上它吧,
再切换到组织1的peer节点上重复执行
`
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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA --channelID mychannel --name clockin --version 1 --init-required --package-id $CC_PACKAGE_ID --sequence 1
peer lifecycle chaincode checkcommitreadiness -C mychannel -n clockin -v 1 --sequence 1 --output json --init-required
`
把链码提交到通道上
通过上一步查询到两个组织都同意(值为true)后,就可以提交链码到通道上了
`
peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin -v 1 --sequence 1 --peerAddresses localhost:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses localhost:9051 --tlsRootCertFiles $PEER0_ORG2_CA --init-required
`
由于需要两个组织的peer节点的背书,因此除了order节点的连接信息了,也加上了两个节点的连接参数。
查询安装状态
最后我们查询下链码是否安装成功
`
peer lifecycle chaincode querycommitted -C $CHANNEL_NAME -n clockin
`
本文由小韦云原创,转载请注明出处:https://www.bctos.cn/doc/10/1845,否则追究其法律责任