我不确定社区是否意识到此问题,但是我尝试在[面料样品]: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
知道发生了什么吗?
存在两种类型的链码
系统链码(对等二进制文件的一部分)
应用程序链代码(由智能合约/链代码开发人员开发)
系统链代码是对等二进制文件本身的一部分,而应用程序链代码在Docker容器中实例化。有各种系统链码,例如LSCC,CSCC,QSCC等。LSCC是指生命周期系统链代码,它管理应用程序链代码的生命周期。LSCC包含各种与链码相关的逻辑,例如安装逻辑,实例化逻辑,升级逻辑,调用和查询逻辑。
所以,重点是
如果chaincode容器已经启动并运行然后,执行查询/调用函数并将结果返回给呼叫者。else由于任何原因,如果链码容器被杀死并且无法运行通过gRPC的请求然后,LSCC调用/查询逻辑再次启动chaincode容器,直到准备好处理呼叫者发出的请求。