我不确定社区是否知道此问题,但我尝试在[fabric samples]下运行余额转移应用程序:https://github.com/hyperledger/fabric-samples。一切似乎都顺利进行。但是,在运行查询或调用操作时,包含链代码的docker容器崩溃并重新启动。你可以通过运行来检查它
docker ps -a
。状态将显示容器刚刚启动。
我查看了被查询的同行的日志,似乎问题出现在这里:
2018-01-17 07:06:33.654 UTC [container] lockContainer -> DEBU 891 waiting for container(dev-peer0.org1.example.com-mycc-v0) lock
2018-01-17 07:06:33.654 UTC [container] lockContainer -> DEBU 892 got container (dev-peer0.org1.example.com-mycc-v0) lock
2018-01-17 07:06:33.655 UTC [dockercontroller] Start -> DEBU 893 Cleanup container dev-peer0.org1.example.com-mycc-v0
****2018-01-17 07:06:33.693 UTC [chaincode] processStream -> ERRO 894 Error handling chaincode support stream: rpc error: code = Canceled desc = context canceled****
2018-01-17 07:06:33.693 UTC [chaincode] deregisterHandler -> DEBU 895 Deregister handler: mycc:v0
2018-01-17 07:06:34.343 UTC [dockercontroller] stopInternal -> DEBU 896 Stopped container dev-peer0.org1.example.com-mycc-v0
2018-01-17 07:06:34.343 UTC [dockercontroller] stopInternal -> DEBU 897 Kill container dev-peer0.org1.example.com-mycc-v0 (API error (409): {"message":"Cannot kill container: dev-peer0.org1.example.com-mycc-v0: Container d818357f76068ab0a9efbf70be9b9a19fd7f6cc7bbe11eaba95c0a61d208ceac is not running"}
)
2018-01-17 07:06:34.459 UTC [dockercontroller] stopInternal -> DEBU 898 Removed container dev-peer0.org1.example.com-mycc-v0
2018-01-17 07:06:34.459 UTC [dockercontroller] Start -> DEBU 899 Start container dev-peer0.org1.example.com-mycc-v0
2018-01-17 07:06:34.459 UTC [dockercontroller] createContainer -> DEBU 89a Create container: dev-peer0.org1.example.com-mycc-v0
2018-01-17 07:06:34.724 UTC [dockercontroller] createContainer -> DEBU 89b Created container: dev-peer0.org1.example.com-mycc-v0-f021beca29998638e0bb7caa7af8fda7f1e709518214a3181d259abcb2347093
知道发生了什么事吗?
答案 0 :(得分:0)
链码有两种类型
系统链码(对等二进制文件的一部分)
应用程序链代码(由智能合约/链代码开发人员开发)
系统链代码是对等二进制文件本身的一部分,而应用程序链代码则在Docker容器中实例化。有各种系统链码,例如LSCC,CSCC,QSCC等。
LSCC是指生命周期系统链代码,它管理应用程序链代码的生命周期。
LSCC包含各种与链码相关的逻辑,例如安装逻辑,实例化逻辑,升级逻辑,调用和查询逻辑。
所以,重点是
如果
chaincode容器已经启动并运行
然后,执行查询/调用函数并将结果返回给
呼叫者。
其他
由于任何原因,如果链码容器被杀死并且无法运行
通过gRPC的请求
然后,
LSCC调用/查询逻辑再次启动chaincode容器,直到
准备好处理调用者发出的请求。