每次我尝试执行有效载荷为> 〜2MB的事务或查询时,我会收到以下错误:
在执行查询后立即从运行业务网络应用程序的Docker容器:
[ERROR] lib/handler.js - Chat stream with peer - on error:
"Error: 8 RESOURCE_EXHAUSTED: Received message larger than max (19090846 vs. 4194304)n
at createStatusError (/usr/local/src/node_modules/grpc/src/client.js:64:15)n
at ClientDuplexStream._emitStatusIfDone (/usr/local/src/node_modules/grpc/src/client.js:270:19)n
at ClientDuplexStream._receiveStatus (/usr/local/src/node_modules/grpc/src/client.js:248:8)n
at /usr/local/src/node_modules/grpc/src/client.js:804:12"
然后从应用侧到达超时时:
{ Error: 2 UNKNOWN: error executing chaincode: failed to execute transaction: timeout expired while executing transaction
at new createStatusError (C:Usersjean5FabricQostodianqostodian-analyzernode_modulesgrpcsrcclient.js:64:15)
at C:Usersjean5FabricQostodianqostodian-analyzernode_modulesgrpcsrcclient.js:583:15
code: 2,
metadata: Metadata { _internal_repr: {} },
details: 'error executing chaincode: failed to execute transaction: timeout expired while executing transaction' }
这些错误表明,当我尝试从查询中检索〜18.2MB的数据时,达到了4MB的默认限制(19090846 vs. 4194304(。
从我所看到的面料中,已经为已经支持多达100MB的面料:
MaxRecvMsgSize = 100 * 1024 * 1024
MaxSendMsgSize = 100 * 1024 * 1024
我还在hyperledger.org上找到了JIRA任务(Fab-5049(,在那里他们遇到了同一问题。但是,没有关于4MB限制的潜在修复的讨论。
问题1:如果面料用100MB进行了硬编码,那么4MB限制来自哪里?
问题2:如何确保GRPC限制确实是100MB?
我也想知道是否可以明确设置GRPC限制,例如在Connection.json中或使用COMPOSER CLI安装/启动网络时。
grpc施加默认限制为4MB。设置GRPC的连接时,您可以指定替代限制。要使用Composer 0.19进行此操作,您需要修改定义您连接到的HyperLeDger面料并提供gprcOptions
的连接配置文件,并提供包含通过GRPC节点实现识别的选项。在此处给出了在对等上设置这些选项的示例。
"peer0.org1.example.com": {
"url": "grpcs://peer0.org1.example.com:7051",
"eventUrl": "grpcs://peer0.org1.example.com:7053"
"grpcOptions": {
"ssl-target-name-override": "peer.org1.example.com",
"grpc.keepalive_time_ms": 600000,
"grpc.max_send_message_length": 15728640,
"grpc.max_receive_message_length": 15728640
},
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE----- <etc> "
}
}
您还可以以类似的方式为订购器设置GRPCoptions。注意消息长度是字节的数量,值为-1表示无限。
不幸的是,目前通过CLI无法使用新的配置文件更新卡存储中的现有卡。如果您使用的是文件系统卡存储,则可以手动替换Connect.json文件。