hyperledger/fabric · error
failed unmarshaling OrdererBlockMetadata
Error message
failed unmarshaling OrdererBlockMetadata
What it means
The SIGNATURES metadata entry of the proposed block must contain an OrdererBlockMetadata protobuf. If proto.Unmarshal of signatureMetadata.Value into OrdererBlockMetadata fails, the verifier wraps the error, meaning the orderer-level metadata in the block is corrupted or of the wrong shape.
Source
Thrown at orderer/consensus/smartbft/verifier.go:279
return nil
}
func (v *Verifier) verifyBlockDataAndMetadata(block *cb.Block, metadata []byte) ([]types.RequestInfo, error) {
if block.Data == nil || len(block.Data.Data) == 0 {
return nil, errors.New("empty block data")
}
if block.Metadata == nil || len(block.Metadata.Metadata) < len(cb.BlockMetadataIndex_name) {
return nil, errors.New("block metadata is either missing or contains too few entries")
}
signatureMetadata, err := protoutil.GetMetadataFromBlock(block, cb.BlockMetadataIndex_SIGNATURES)
if err != nil {
return nil, err
}
ordererMetadataFromSignature := &cb.OrdererBlockMetadata{}
if err := proto.Unmarshal(signatureMetadata.Value, ordererMetadataFromSignature); err != nil {
return nil, errors.Wrap(err, "failed unmarshaling OrdererBlockMetadata")
}
// Ensure the view metadata in the block signature and in the proposal are the same
metadataInBlock := &smartbftprotos.ViewMetadata{}
if err := proto.Unmarshal(ordererMetadataFromSignature.ConsenterMetadata, metadataInBlock); err != nil {
return nil, errors.Wrap(err, "failed unmarshaling smartbft metadata from block")
}
metadataFromProposal := &smartbftprotos.ViewMetadata{}
if err := proto.Unmarshal(metadata, metadataFromProposal); err != nil {
return nil, errors.Wrap(err, "failed unmarshaling smartbft metadata from proposal")
}
if !proto.Equal(metadataInBlock, metadataFromProposal) {
return nil, errors.Errorf(
"expected metadata in block to be [view_id:%d latest_sequence:%d] but got [view_id:%d latest_sequence:%d]",
metadataFromProposal.GetViewId(), metadataFromProposal.GetLatestSequence(),View on GitHub (pinned to 2736b63f8f)
Solutions
- Rebuild the block metadata using protoutil/fabric orderer helpers so SIGNATURES carries a valid OrdererBlockMetadata
- Confirm all nodes use a compatible fabric version with the same OrdererBlockMetadata schema
- Inspect the offending metadata bytes (log base64) to identify corruption source
- Discard the malformed proposal and re-propose from current leader state
Example fix
// before: raw view metadata written into SIGNATURES slot
metadata[cb.BlockMetadataIndex_SIGNATURES] = consenterMetadataRaw
// after: wrap in OrdererBlockMetadata
obm := &cb.OrdererBlockMetadata{ConsenterMetadata: consenterMetadataRaw}
val, _ := proto.Marshal(obm)
metadata[cb.BlockMetadataIndex_SIGNATURES] = &cb.Metadata{Value: val} Defensive patterns
Strategy: try-catch
Validate before calling
sm := protoutil.GetMetadataFromBlock(block, cb.BlockMetadataIndex_SIGNATURES)
obm := &cb.OrdererBlockMetadata{}
if err := proto.Unmarshal(sm.Value, obm); err != nil { return fmt.Errorf("invalid orderer metadata") } Type guard
func validOrdererMetadata(b *cb.Block) bool {
sm, err := protoutil.GetMetadataFromBlock(b, cb.BlockMetadataIndex_SIGNATURES)
if err != nil { return false }
return proto.Unmarshal(sm.Value, &cb.OrdererBlockMetadata{}) == nil
} Try / catch
if _, err := verifier.VerifyProposal(...); err != nil && strings.Contains(err.Error(), "failed unmarshaling OrdererBlockMetadata") {
logger.Warn("corrupted orderer metadata in proposal; request re-proposal")
} Prevention
- Write SIGNATURES metadata only via fabric orderer helpers
- Keep fabric versions consistent across the cluster
- Log offending metadata bytes (base64) for corruption diagnosis
- Validate metadata decodability before accepting proposals
When it happens
Trigger: GetMetadataFromBlock succeeds but the SIGNATURES metadata Value bytes are not a valid OrdererBlockMetadata — wrong metadata index populated, corrupted bytes, or metadata written by a different component/version.
Common situations: Custom code writing raw bytes into the SIGNATURES metadata slot; version mismatch where the OrdererBlockMetadata schema changed; corrupted proposal from WAL/network; metadata truncation during transport or persistence.
Related errors
- malformed message
- bad metadata
- malformed signature format
- failed unmarshaling smartbft metadata from block
- failed unmarshaling smartbft metadata from proposal
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/e70c7becc5088241.
Report an issue: GitHub.