Hyperledger Fabric链码测试日志
链码可以看成是在Hyperledger Fabric上的智能合约,本文可以在简单了解链码的概念之后在fabric-samples中进行链码测试。
1. 链码的安装、实例化、查询与调用
1.1 安装链码(调用链码处理交易前,需要把链码部署到Peer节点上,即安装+实例化)
首先启动网络,进入CLI容器,检查节点是否已经加入通道:
peer channel list ##不出意外应该加入了mychannel的通道中
设置环境变量:
export CHANNEL_NAME=mychannel
使用install命令安装链码:
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
1.2 实例化链码
使用instantiate命令实例化链码(参数、背书策略):
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
1.3 查询链码
使用query命令查询:(查询参数a的值)
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
1.4 调用链码,根据链码函数给出相应参数(这里的参数是让a给b转账10)
使用invoke命令调用链码:(相比之前的实例化,不需要-v版本号)
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'
执行成功后就可以用查询命令查看a、b的账户余额,应该是90、110。
2.链码的打包与升级
链码部署除了1中所述的方式之外,还可以采用先打包、再签名、最后进行安装。
2.1 链码的打包
对于一个已经编写完成的链码,可以使用package命令进行打包:
peer chaincode package -n exacc -v 1.0 -p github.com/chaincode/chaincode_example02/go/ -s -S -i "AND('Org1MSP.admin')" ccpack.out
2.2 链码的签名
使用signpackage命令进行签名:
peer chaincode signpackage ccpack.out signdccpack.out
2.3 链码的安装、实例化与测试
peer chaincode install signdccpack.out
然后可以按照1中的方法进行实例化与测试,这里就不赘述了。
2.4 链码的升级
随着需求场景的变化,链码也需要实时做出修改,首先随修改之后的链码进行安装(修改后应该为2.0版本):
peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/
使用upgrade命令升级链码:
peer chaincode upgrade -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 2.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
注意:升级时inti函数会重置数据信息
3.链码的dev开发测试模式
上述的测试过程加入大量参数,十分繁琐,下面介绍一种快速测试的方法,dev模式下,链码由用户构建并启动。这部分我们需要三个终端窗口。
3.1 启动网络
首先检查Docker镜像信息:
sudo docker images
关闭之前的网络环境:
sudo docker-compose -f docker-compose-cli.yaml down
进入chaincode-docker-devmode目录:
cd ~/hyfa/fabric-samples/chaincode-docker-devmode
该目录下包含网络、通道、初始区块等相关的内容,使用docker-compose-simple.yaml文件(网络启动依赖的配置文件)来启动网络:
sudo docker-compose -f docker-compose-simple.yaml up -d
3.2 构建并启动链码
打开一个新的终端2窗口,进入chaincode容器:
sudo docker exec -it chaincode bash
进入目录编译链码:
cd chaincode_example02/go/
go build
启动并运行链码:
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./go
3.3 调用链码
开启一个新的终端3窗口,首先进入cli容器:
sudo docker exec -it cli bash
安装链码:
peer chaincode install -p chaincodedev/chaincode/chaincode_example02/go -n mycc -v 0
实例化链码:
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["init","a","100","b","200"]}' -C myc
查询链码:
peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc
执行事务:
peer chaincode invoke -n mycc -c '{"Args":["invoke","a","b","200"]}' -C myc
其实不难看出链码的测试管理主要是由链码生命周期中的5个命令构成的:
- install
- instantiate
- upgrade
- package
- signpackage
熟悉这5个命令的用途以及命令执行时的参数结构就能很好的掌握链码的开发测试,对链码运行架构的理解也很有好处。链码的简单管理和测试就到这里啦,过两天再更新链码的开发与实践。