{"record":{"id":"3acff828420c454a","repo":"hyperledger/fabric","slug":"block-with-id-d-on-channel-s-does-not-have-m","errorCode":null,"errorMessage":"block with id [%d] on channel [%s] does not have metadata or contains too few entries","messagePattern":"block with id \\[(.+?)\\] on channel \\[(.+?)\\] does not have metadata or contains too few entries","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/deliverclient/block_verification.go","lineNumber":305,"sourceCode":"\terr := a.sigVerifierFunc(block.Header, block.Metadata)\n\tif err == nil {\n\t\ta.lastBlockHeader = block.Header\n\t\ta.lastBlockHeaderHash = protoutil.BlockHeaderHash(block.Header)\n\t}\n\n\treturn err\n}\n\n// UpdateBlockHeader saves the last block header that was verified and handled successfully.\n// This must be called after VerifyBlock and VerifyBlockAttestation and successfully handling the block.\nfunc (a *BlockVerificationAssistant) UpdateBlockHeader(block *common.Block) {\n\ta.lastBlockHeader = block.Header\n\ta.lastBlockHeaderHash = protoutil.BlockHeaderHash(block.Header)\n}\n\nfunc (a *BlockVerificationAssistant) verifyMetadata(block *common.Block) error {\n\tif block.Metadata == nil || len(block.Metadata.Metadata) < len(common.BlockMetadataIndex_name) {\n\t\treturn errors.Errorf(\"block with id [%d] on channel [%s] does not have metadata or contains too few entries\", block.Header.Number, a.channelID)\n\t}\n\n\treturn nil\n}\n\nfunc (a *BlockVerificationAssistant) verifyHeader(block *common.Block) error {\n\tif block == nil {\n\t\treturn errors.Errorf(\"block must be different from nil, channel=%s\", a.channelID)\n\t}\n\tif block.Header == nil {\n\t\treturn errors.Errorf(\"invalid block, header must be different from nil, channel=%s\", a.channelID)\n\t}\n\n\texpectedBlockNum := a.lastBlockHeader.Number + 1\n\tif expectedBlockNum != block.Header.Number {\n\t\treturn errors.Errorf(\"expected block number is [%d] but actual block number inside block is [%d]\", expectedBlockNum, block.Header.Number)\n\t}\n","sourceCodeStart":287,"sourceCodeEnd":323,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/common/deliverclient/block_verification.go#L287-L323","documentation":"verifyMetadata ensures a delivered block carries block.Metadata with entries for every registered BlockMetadataIndex (SIGNATURES, LAST_CONFIG, TRANSACTIONS_FILTER, ORDERER). A nil Metadata or too-few entries means signature/metadata validation is impossible, so the block is rejected.","triggerScenarios":"VerifyBlock or VerifyBlockAttestation receives a block constructed without Metadata (hand-built blocks in tooling/tests), a block produced by an incompatible orderer writing fewer metadata entries, or a block truncated during storage/transfer so Metadata is missing.","commonSituations":"Custom block generators for tests omitting Metadata; delivering pre-fabric-1.4-style blocks; corrupted block files; cross-version fabric components with differing metadata layouts.","solutions":["Ensure the block source is a real orderer-produced block containing full Metadata (signature metadata, last-config pointer, tx filter).","Re-fetch the block from a healthy orderer/peer.","Upgrade/align fabric component versions so metadata layouts match.","If generating blocks for tests, populate Metadata with len(common.BlockMetadataIndex_name) entries."],"exampleFix":"// before\nblock := &common.Block{Header: hdr, Data: data} // Metadata nil\n\n// after\nblock := &common.Block{Header: hdr, Data: data, Metadata: &common.BlockMetadata{Metadata: [][]byte{sigMeta, lastConfig, txFilter, ordererMeta}}}","handlingStrategy":"validation","validationCode":"if block.Metadata == nil || len(block.Metadata.Metadata) < len(common.BlockMetadataIndex_name) {\n    return errors.New(\"block metadata incomplete; refetch from orderer\")\n}","typeGuard":"func hasFullMetadata(block *common.Block) bool {\n    return block != nil && block.Metadata != nil && len(block.Metadata.Metadata) >= len(common.BlockMetadataIndex_name)\n}","tryCatchPattern":"if err := bva.VerifyBlock(block, opts); err != nil {\n    if strings.Contains(err.Error(), \"does not have metadata\") {\n        block, err = refetchBlock(block.Header.Number)\n    }\n    return err\n}","preventionTips":["Use real orderer-produced blocks; don't hand-assemble blocks for tooling without Metadata","Align fabric versions across components (metadata layout changes between versions)","Validate persisted blocks after storage restores/migrations"],"tags":["hyperledger-fabric","block-verification","missing-metadata"],"backgroundTag":"missing-block-metadata","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"}