hyperledger/fabric · error
block header is nil
Error message
block header is nil
What it means
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.
Source
Thrown at orderer/common/cluster/deliver.go:465
p.Logger.Errorf("Failed sending seek envelope to %s: %v", endpoint, err)
stream.abort()
return nil, err
}
return stream, nil
}
func extractBlockFromResponse(resp *orderer.DeliverResponse) (*common.Block, error) {
switch t := resp.Type.(type) {
case *orderer.DeliverResponse_Block:
block := t.Block
if block == nil {
return nil, errors.New("block is nil")
}
if block.Data == nil {
return nil, errors.New("block data is nil")
}
if block.Header == nil {
return nil, errors.New("block header is nil")
}
if block.Metadata == nil || len(block.Metadata.Metadata) == 0 {
return nil, errors.New("block metadata is empty")
}
return block, nil
case *orderer.DeliverResponse_Status:
if t.Status == common.Status_FORBIDDEN {
return nil, ErrForbidden
}
if t.Status == common.Status_SERVICE_UNAVAILABLE {
return nil, ErrServiceUnavailable
}
return nil, errors.Errorf("faulty node, received: %v", resp)
default:
return nil, errors.Errorf("response is of type %v, but expected a block", reflect.TypeOf(resp.Type))
}
}
View on GitHub (pinned to 2736b63f8f)
Solutions
- Retry the fetch from another endpoint
- Audit the source node's ledger integrity and logs
- Verify network path is not truncating protobuf messages
Defensive patterns
Strategy: validation
Validate before calling
if block := resp.GetBlock(); block != nil && block.Header == nil {
return fmt.Errorf("block header missing in response")
} Type guard
func hasBlockHeader(resp *orderer.DeliverResponse) bool {
return resp.GetBlock() != nil && resp.GetBlock().Header != nil
} Try / catch
block, err := extractBlockFromResponse(resp)
if err != nil {
log.Errorf("discarding headerless block: %v", err)
return err
} Prevention
- Validate header presence before hashing/verifying blocks
- Audit nodes emitting headerless blocks as possibly compromised/buggy
- Keep serialization consistent across fabric versions
When it happens
Trigger: extractBlockFromResponse received a DeliverResponse_Block where block.Header is nil.
Common situations: Buggy or compromised remote node emitting header-less blocks; corrupted gRPC payload in transit.
Related errors
- block is nil
- block data is nil
- block metadata is empty
- deliver client identity expired %v before
- message is nil
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/fa341ec7f7f0a7e3.
Report an issue: GitHub.