正常情况下chaincode由对等体启动和维护。然而,在“开发模式”下,链码由用户构建并启动
如果没有安装Hyperledger Fabric Samples请先安装
如果没有下载Docker images请先下载
跳转至fabric-samples
的chaincode-docker-devmode
目录
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/
使用docker images
查看Docker镜像信息(显示本地Docker Registry)
$ sudo docker images
会看到如下输出
REPOSITORY TAG IMAGE ID CREATED SIZE
hyperledger/fabric-tools latest b7bfddf508bc About an hour ago 1.46GB
hyperledger/fabric-tools x86_64-1.1.0 b7bfddf508bc About an hour ago 1.46GB
hyperledger/fabric-orderer latest ce0c810df36a About an hour ago 180MB
hyperledger/fabric-orderer x86_64-1.1.0 ce0c810df36a About an hour ago 180MB
hyperledger/fabric-peer latest b023f9be0771 About an hour ago 187MB
hyperledger/fabric-peer x86_64-1.1.0 b023f9be0771 About an hour ago 187MB
hyperledger/fabric-javaenv latest 82098abb1a17 About an hour ago 1.52GB
hyperledger/fabric-javaenv x86_64-1.1.0 82098abb1a17 About an hour ago 1.52GB
hyperledger/fabric-ccenv latest c8b4909d8d46 About an hour ago 1.39GB
hyperledger/fabric-ccenv x86_64-1.1.0 c8b4909d8d46 About an hour ago 1.39GB
......
使用三个终端
终端1 启动网络
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/
该目录下有
myc.tx
文件
启动网络
$ sudo docker-compose -f docker-compose-simple.yaml up -d
终端2 建立并启动链码
打开第二个终端, 进入到chaincode-docker-devmode
目录
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/
进入CLI
chaincode容器的作用是为发简化的方式建立并启动链码
$sudo docker exec -it chaincode bash
命令提示符变为:
root@858726aed16e:/opt/gopath/src/chaincode#
编译
进入sacc目录编译chaincode
root@858726aed16e:/opt/gopath/src/chaincode# cd sacc
root@858726aed16e:/opt/gopath/src/chaincode/sacc# go build
运行chaincode
CORE_PEER_ADDRESS=peer:7052
CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
mycc: 链码名称
0: 链码初始版本号
终端3 使用链码
安装及实例化
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/
$ sudo docker exec -it cli bash
进入CLI容器后执行如下命令安装及实例化chaincode
容器中已经有
myc.block
、myc.tx
两个文件, 可以直接使用
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc
<font color=red>链码名与版本要与运行链码时设置的值一致</font>
调用
进行调用,将a
的值更改为20
peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc
执行成功, 输出如下内容
......
...... Chaincode invoke successful. result: status:200 payload:"20"
......
查询
查询a
的值
peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc
执行成功, 输出: Query Result: 20
打包链码及签名
通过将链码相关数据进行封装, 可以实现对其进行打包和签名操作
打包
peer chaincode package -n mycc -p chaincodedev/chaincode/sacc -v 0 -s -S -i "AND('OrgA.admin')" ccpack.out
-s: 创建角色支持的CC部署规范包, 而不是原始的CC部署规范
-S: 如果创建CC部署规范方案角色支持,也与本地MSP签名
-i: 指定实例化策略
打包后的文件, 可以直接用于install操作, 如:
peer chaincode install ccpack.out
签名
对一个打包文件进行签名操作(添加当前MSP签名到签名列表中)
peer chaincode signpackage ccpack.out signedccpack.out
升级链码
退出终端3, 停止终端2的服务
终端2中重新运行chaincode
$ sudo docker exec -it chaincode bash
cd sacc
go build
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:1 ./sacc
注意版本为 1.0
, 旧版本为 0
终端3
打开终端3, 进入CLI容器
$ sudo docker exec -it cli bash
安装及升级
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 1
peer chaincode upgrade -n mycc -v 1 -c '{"Args":["a", "100"]}' -C myc
注意版本号必须一致
在对某链码代码升级前, 推荐先将所有该链码的容器停止, 并从Peer上备份并移除旧链码部署文件. 之后先在个别Peer节点上部署新链码, 对原有数据进行测试, 成功后再在其它节点上进行升级操作
查询
查询a
的值
peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc
执行成功, 输出: Query Result:100