{"record":{"id":"12542b6e17216af2","repo":"hyperledger/fabric","slug":"response-error-unknown-type-t","errorCode":null,"errorMessage":"response error: unknown type %T","messagePattern":"response error: unknown type %T","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/peer/common/deliverclient.go","lineNumber":86,"sourceCode":"\tmsg, err := d.Service.Recv()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"error receiving\")\n\t}\n\tswitch t := msg.Type.(type) {\n\tcase *ab.DeliverResponse_Status:\n\t\tlogger.Infof(\"Expect block, but got status: %v\", t)\n\t\treturn nil, errors.Errorf(\"can't read the block: %v\", t)\n\tcase *ab.DeliverResponse_Block:\n\t\tlogger.Infof(\"Received block: %v\", t.Block.Header.Number)\n\t\tif resp, err := d.Service.Recv(); err != nil { // Flush the success message\n\t\t\tlogger.Errorf(\"Failed to flush success message: %s\", err)\n\t\t} else if status := resp.GetStatus(); status != cb.Status_SUCCESS {\n\t\t\tlogger.Errorf(\"Expect status to be SUCCESS, got: %s\", status)\n\t\t}\n\n\t\treturn t.Block, nil\n\tdefault:\n\t\treturn nil, errors.Errorf(\"response error: unknown type %T\", t)\n\t}\n}\n\n// GetSpecifiedBlock gets the specified block from a peer/orderer's deliver\n// service\nfunc (d *DeliverClient) GetSpecifiedBlock(num uint64) (*cb.Block, error) {\n\terr := d.seekSpecified(num)\n\tif err != nil {\n\t\treturn nil, errors.WithMessage(err, \"error getting specified block\")\n\t}\n\n\treturn d.readBlock()\n}\n\n// GetOldestBlock gets the oldest block from a peer/orderer's deliver service\nfunc (d *DeliverClient) GetOldestBlock() (*cb.Block, error) {\n\terr := d.seekOldest()\n\tif err != nil {","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/peer/common/deliverclient.go#L68-L104","documentation":"readBlock's type switch on the DeliverResponse oneof matched neither Status nor Block, meaning the response carried an unexpected payload type. This is a protocol-shape mismatch rather than a server rejection.","triggerScenarios":"The deliver stream delivered a DeliverResponse whose oneof is neither DeliverResponse_Status nor DeliverResponse_Block — practically only from a malformed or non-standard server implementation.","commonSituations":"Version-skewed server/client protobuf definitions, a custom or intermediary gRPC service speaking a different message shape, corrupted stream framing.","solutions":["Confirm client and server use matching fabric/protobuf versions","Bypass proxies that may mangle the gRPC stream and connect directly","Regenerate bindings from the correct protobuf definitions if customized","Log the full message type for diagnosis before retrying"],"exampleFix":"// before\nswitch t := msg.Type.(type) {\ncase *ab.DeliverResponse_Block: ...\n}\n// after\nswitch t := msg.Type.(type) {\ncase *ab.DeliverResponse_Block: ...\ncase *ab.DeliverResponse_Status: handleStatus(t)\ndefault: return nil, errors.Errorf(\"response error: unknown type %T\", t)\n}","handlingStrategy":"type-guard","validationCode":"// ensure client and server protobuf versions match before opening the stream\n// fabric-sdk version must match the peer/orderer release line","typeGuard":"block, ok := msg.Type.(*ab.DeliverResponse_Block)\nif !ok {\n    return fmt.Errorf(\"expected block response, got %T\", msg.Type)\n}","tryCatchPattern":"block, err := client.GetSpecifiedBlock(num)\nif err != nil && strings.Contains(err.Error(), \"unknown type\") {\n    log.Printf(\"protocol mismatch: %v; verify fabric versions\", err)\n}","preventionTips":["Keep SDK/CLI and peer protobuf definitions in lockstep","Avoid custom intermediaries on the deliver stream","Log %T when unexpected payloads appear"],"tags":["fabric","deliver","protobuf","protocol-mismatch"],"backgroundTag":"grpc-unknown-response-type","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}