Hyperledger Fabric V1.1/Composer V0.19 - 达到 gRPC 消息最大限制 (4MB)

Hyperledger Fabric V1.1/Composer V0.19 - gRPC message max limit reached (4MB)

每次我尝试执行有效负载 > ~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:\Users\jean5\Fabric\Qostodian\qostodian-analyzer\node_modules\grpc\src\client.js:64:15)
at C:\Users\jean5\Fabric\Qostodian\qostodian-analyzer\node_modules\grpc\src\client.js:583:15
code: 2,
metadata: Metadata { _internal_repr: {} },
details: 'error executing chaincode: failed to execute transaction: timeout expired while executing transaction' }

这些错误表明当我尝试从查询中检索约 18.2MB 的数据时达到了 GRPC 默认限制 4MB(19090846 与 4194304)。

据我所知,Fabric 是 hardcoded to support up to 100MB already:

MaxRecvMsgSize = 100 * 1024 * 1024
MaxSendMsgSize = 100 * 1024 * 1024

我还在 hyperledger.org 上发现了一个 JIRA 任务 (FAB-5049),他们面临同样的问题。但是,没有讨论 4MB 限制的潜在修复。

问题 1:如果 fabric 硬编码为 100MB,那 4MB 的限制从何而来?

问题2:如何确定GRPC限制确实是100MB?

我还想知道是否可以明确设置 GRPC 限制,例如在 connection.json 或 installing/starting 使用 composer CLI 的网络时。

GRPC 强加了 4Mb 的默认限制。当通过 grpc 建立连接时,您可以指定替代限制。要使用 Composer 0.19 执行此操作,您需要修改连接配置文件,该配置文件定义了您连接到的超级账本结构,并提供 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 使用新配置文件更新卡片商店中的现有卡片。如果您使用的是文件系统卡片商店,那么您可以为您的卡片手动替换 connection.json 文件。