{"record":{"id":"bebd74e400256ad2","repo":"hyperledger/fabric","slug":"block-metadata-is-empty","errorCode":null,"errorMessage":"block metadata is empty","messagePattern":"block metadata is empty","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/cluster/deliver.go","lineNumber":468,"sourceCode":"\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\nfunc (p *BlockPuller) seekLastEnvelope() (*common.Envelope, error) {\n\treturn protoutil.CreateSignedEnvelopeWithTLSBinding(\n\t\tcommon.HeaderType_DELIVER_SEEK_INFO,","sourceCodeStart":450,"sourceCodeEnd":486,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/cluster/deliver.go#L450-L486","documentation":"Block Metadata (e.g. the last-config metadata) is required by the block puller; a block with empty metadata cannot be validated for purposes like locating the latest config block. extractBlockFromResponse rejects it.","triggerScenarios":"extractBlockFromResponse received a DeliverResponse_Block where block.Metadata is nil or block.Metadata.Metadata has zero entries.","commonSituations":"Source orderer serving a truncated/older-format block; corrupted metadata in the source ledger; binary version skew affecting metadata fields.","solutions":["Pull from a different, healthy orderer endpoint","Verify the source node's ledger metadata integrity","Align fabric versions across cluster nodes"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if md := resp.GetBlock().GetMetadata(); md == nil || len(md.Metadata) == 0 {\n    return fmt.Errorf(\"block metadata missing in response\")\n}","typeGuard":"func hasBlockMetadata(resp *orderer.DeliverResponse) bool {\n    md := resp.GetBlock().GetMetadata()\n    return md != nil && len(md.Metadata) > 0\n}","tryCatchPattern":"block, err := extractBlockFromResponse(resp)\nif err != nil {\n    return fmt.Errorf(\"invalid block from %s: %w\", endpoint, err)\n}","preventionTips":["Check metadata (esp. last-config) when using blocks for config discovery","Re-pull from a healthy endpoint when metadata is empty","Verify ledger integrity on nodes serving metadata-empty blocks"],"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-08T10:18:20.063Z"}