Fabric Chaincode Dev模式下新增/更新链码的位置及操作步骤咨询
我来帮你梳理下这个模式下新增和更新链码的具体操作——毕竟dev模式的流程和生产模式有区别,得抓准细节:
一、链码存放位置
不管是新增链码还是修改现有链码,都建议放在fabric-samples/chaincode目录下。这是samples默认的链码工作目录,dev模式的docker-compose配置已经默认把这个目录映射到了容器内部,方便容器直接访问链码文件。比如你要新增一个叫my_custom_chaincode的链码,直接在chaincode下创建对应文件夹,把你的链码文件(比如my_custom_chaincode.go)放进去就行。
二、新增链码的具体操作步骤
因为是Chaincode-Docker-Dev模式,链码是本地启动并注册到peer,不需要打包成tar包,步骤比生产模式简化不少:
启动dev模式环境(如果还没运行)
先进入fabric-samples/chaincode-docker-devmode目录,执行启动命令:docker-compose -f docker-compose-simple.yaml up这会启动peer、orderer和一个cli容器,保持这个终端运行。
新开终端,启动链码容器
切换到你新增的链码所在目录(比如fabric-samples/chaincode/my_custom_chaincode),执行以下命令启动链码容器并注册到peer:docker run -it --rm --name my_custom_chaincode \ -v $(pwd):/opt/gopath/src/github.com/hyperledger/fabric/chaincode \ -e CORE_PEER_ADDRESS=peer:7052 \ -e CORE_CHAINCODE_ID_NAME=mycc:1.0 \ hyperledger/fabric-peer:1.1 chaincode run -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}'说明:
CORE_CHAINCODE_ID_NAME是链码的唯一标识,格式为链码名:版本号-C mychannel指定通道名,dev模式默认通道就是mychannel- 最后的
init参数是链码初始化的参数,根据你的链码逻辑自行调整
在cli容器中完成安装与实例化
再开一个终端,进入cli容器:docker exec -it cli bash先安装链码:
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/chaincode/my_custom_chaincode然后实例化(第一次使用这个链码必须执行):
peer chaincode instantiate -o orderer:7050 -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member')"这里的
-P是权限策略,按需调整即可。调用/查询验证链码
实例化完成后就可以测试了:# 查询a的余额 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}' # 执行转账操作 peer chaincode invoke -o orderer:7050 -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'
三、更新/升级现有链码(比如chaincode_example02)
如果是修改现有链码并升级,按以下步骤来:
修改链码文件
直接编辑fabric-samples/chaincode/chaincode_example02/chaincode_example02.go的代码,比如调整转账逻辑、新增查询方法等。停止并删除旧链码容器
先找到旧链码的容器名(比如之前启动的chaincode_example02),执行:docker stop chaincode_example02 docker rm chaincode_example02启动新版本链码容器
进入chaincode_example02目录,启动新版本链码——注意版本号要更新(比如从1.0改成2.0):docker run -it --rm --name chaincode_example02_v2 \ -v $(pwd):/opt/gopath/src/github.com/hyperledger/fabric/chaincode \ -e CORE_PEER_ADDRESS=peer:7052 \ -e CORE_CHAINCODE_ID_NAME=mycc:2.0 \ hyperledger/fabric-peer:1.1 chaincode run -C mychannel -n mycc -v 2.0 -c '{"Args":["init","a","100","b","200"]}'在cli容器中执行升级操作
进入cli容器,先安装新版本链码:peer chaincode install -n mycc -v 2.0 -p github.com/hyperledger/fabric/chaincode/chaincode_example02然后执行升级命令:
peer chaincode upgrade -o orderer:7050 -C mychannel -n mycc -v 2.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member')"注意:如果你的链码升级不需要重置状态,可以根据链码的升级逻辑调整
init参数,有些链码支持无状态升级,按需修改即可。验证升级效果
调用新版本链码,确认修改后的逻辑正常运行:peer chaincode invoke -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}' peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
几个关键注意事项
- 链码版本号必须唯一,升级时不能和旧版本重复,否则会报错
- dev模式下链码容器是临时的,停止后会自动删除,所以每次修改链码后都需要重新启动链码容器
- 如果你的链码依赖第三方Go包,需要先在本地生成
vendor目录(用go mod vendor命令),并把vendor目录放到链码文件夹下,确保容器能读取到依赖
内容的提问来源于stack exchange,提问作者Skadoosh

