code: func (h *Handler) serialSendAsync(msg *pb.ChaincodeMessage) {
  	go func() {
  		if err := h.serialSend(msg); err != nil {
  			// provide an error response to the caller
  			resp := &pb.ChaincodeMessage{
  				Type:      pb.ChaincodeMessage_ERROR,
  				Payload:   []byte(err.Error()),
  				Txid:      msg.Txid,
  				ChannelId: msg.ChannelId,
  			}
  			h.Notify(resp)
  
  			// surface send error to stream processing
  			h.errChan <- err
  		}
  	}()
  }
docs: // serialSendAsync serves the same purpose as serialSend (serialize msgs so gRPC will
  // be happy). In addition, it is also asynchronous so send-remoterecv--localrecv loop
  // can be nonblocking. Only errors need to be handled and these are handled by
  // communication on supplied error channel. A typical use will be a non-blocking or
  // nil channel