{"record":{"id":"fa341ec7f7f0a7e3","repo":"hyperledger/fabric","slug":"block-header-is-nil-fa341e","errorCode":null,"errorMessage":"block header is nil","messagePattern":"block header is nil","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/cluster/deliver.go","lineNumber":465,"sourceCode":"\t\tp.Logger.Errorf(\"Failed sending seek envelope to %s: %v\", endpoint, err)\n\t\tstream.abort()\n\t\treturn nil, err\n\t}\n\treturn stream, nil\n}\n\nfunc extractBlockFromResponse(resp *orderer.DeliverResponse) (*common.Block, error) {\n\tswitch t := resp.Type.(type) {\n\tcase *orderer.DeliverResponse_Block:\n\t\tblock := t.Block\n\t\tif block == nil {\n\t\t\treturn nil, errors.New(\"block is nil\")\n\t\t}\n\t\tif block.Data == nil {\n\t\t\treturn nil, errors.New(\"block data is nil\")\n\t\t}\n\t\tif block.Header == nil {\n\t\t\treturn nil, errors.New(\"block header is nil\")\n\t\t}\n\t\tif block.Metadata == nil || len(block.Metadata.Metadata) == 0 {\n\t\t\treturn nil, errors.New(\"block metadata is empty\")\n\t\t}\n\t\treturn block, nil\n\tcase *orderer.DeliverResponse_Status:\n\t\tif t.Status == common.Status_FORBIDDEN {\n\t\t\treturn nil, ErrForbidden\n\t\t}\n\t\tif t.Status == common.Status_SERVICE_UNAVAILABLE {\n\t\t\treturn nil, ErrServiceUnavailable\n\t\t}\n\t\treturn nil, errors.Errorf(\"faulty node, received: %v\", resp)\n\tdefault:\n\t\treturn nil, errors.Errorf(\"response is of type %v, but expected a block\", reflect.TypeOf(resp.Type))\n\t}\n}\n","sourceCodeStart":447,"sourceCodeEnd":483,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/cluster/deliver.go#L447-L483","documentation":"extractBlockFromResponse guard: a block received over the cluster deliver stream has a nil Header. Without the header the block's number, previous hash, and data hash are unknown, so it cannot be committed; the response from the source orderer is malformed.","triggerScenarios":"extractBlockFromResponse received a DeliverResponse_Block where block.Header is nil.","commonSituations":"Buggy or compromised remote node emitting header-less blocks; corrupted gRPC payload in transit.","solutions":["Retry the fetch from another endpoint","Audit the source node's ledger integrity and logs","Verify network path is not truncating protobuf messages"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if block := resp.GetBlock(); block != nil && block.Header == nil {\n    return fmt.Errorf(\"block header missing in response\")\n}","typeGuard":"func hasBlockHeader(resp *orderer.DeliverResponse) bool {\n    return resp.GetBlock() != nil && resp.GetBlock().Header != nil\n}","tryCatchPattern":"block, err := extractBlockFromResponse(resp)\nif err != nil {\n    log.Errorf(\"discarding headerless block: %v\", err)\n    return err\n}","preventionTips":["Validate header presence before hashing/verifying blocks","Audit nodes emitting headerless blocks as possibly compromised/buggy","Keep serialization consistent across fabric versions"],"tags":["deliver","block-sync","malformed-response"],"backgroundTag":"malformed-block-response","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}