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

  1. Retry the fetch from another endpoint
  2. Audit the source node's ledger integrity and logs
  3. 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

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


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/fa341ec7f7f0a7e3. Report an issue: GitHub.