code: func (o *Orderer) SendDeliver(ctx reqContext.Context, envelope *fab.SignedEnvelope) (chan *common.Block, chan error) {
  
  	responses := make(chan *common.Block)
  	errs := make(chan error, 1)
  
  	conn, err := o.conn(ctx)
  	if err != nil {
  		rpcStatus, ok := grpcstatus.FromError(err)
  		if ok {
  			errs <- errors.WithMessage(status.NewFromGRPCStatus(rpcStatus), "connection failed")
  		} else {
  			errs <- status.New(status.OrdererClientStatus, status.ConnectionFailed.ToInt32(), err.Error(), nil)
  		}
  
  		close(responses)
  		return responses, errs
  	}
  
  	// Create atomic broadcast client
  	broadcastClient, err := ab.NewAtomicBroadcastClient(conn).Deliver(ctx)
  	if err != nil {
  		logger.Errorf("deliver failed [%s]", err)
  		o.releaseConn(ctx, conn)
  
  		errs <- errors.Wrap(err, "deliver failed")
  
  		close(responses)
  		return responses, errs
  	}
  
  	// Receive blocks from the GRPC stream and put them on the channel
  	go func() {
  		blockStream(broadcastClient, responses, errs)
  		o.releaseConn(ctx, conn)
  	}()
  
  	// Send block request envelope
  	logger.Debug("Requesting blocks from ordering service")
  	err = broadcastClient.Send(&common.Envelope{
  		Payload:   envelope.Payload,
  		Signature: envelope.Signature,
  	})
  	if err != nil {
  		logger.Warnf("failed to send block request to orderer [%s]", err)
  	}
  
  	if err = broadcastClient.CloseSend(); err != nil {
  		logger.Debugf("unable to close deliver client [%s]", err)
  	}
  
  	return responses, errs
  }
docs: // SendDeliver sends a deliver request to the ordering service and returns the
  // blocks requested
  // envelope: contains the seek request for blocks