code: func (c *InternalClient) RowAttrDiff(ctx context.Context, uri *pilosa.URI, index, field string, blks []pilosa.AttrBlock) (map[uint64]map[string]interface{}, error) {
  	span, ctx := tracing.StartSpanFromContext(ctx, "InternalClient.RowAttrDiff")
  	defer span.Finish()
  
  	if uri == nil {
  		uri = c.defaultURI
  	}
  	u := uriPathToURL(uri, fmt.Sprintf("/internal/index/%s/field/%s/attr/diff", index, field))
  
  	// Encode request.
  	buf, err := json.Marshal(postFieldAttrDiffRequest{Blocks: blks})
  	if err != nil {
  		return nil, errors.Wrap(err, "marshaling")
  	}
  
  	// Build request.
  	req, err := http.NewRequest("POST", u.String(), bytes.NewReader(buf))
  	if err != nil {
  		return nil, errors.Wrap(err, "creating request")
  	}
  	req.Header.Set("Content-Type", "application/json")
  	req.Header.Set("User-Agent", "pilosa/"+pilosa.Version)
  	req.Header.Set("Accept", "application/json")
  
  	// Execute request.
  	resp, err := c.executeRequest(req.WithContext(ctx))
  	if err != nil {
  		if resp != nil && resp.StatusCode == http.StatusNotFound {
  			return nil, pilosa.ErrFieldNotFound
  		}
  		return nil, err
  	}
  	defer resp.Body.Close()
  
  	// Decode response object.
  	var rsp postFieldAttrDiffResponse
  	if err := json.NewDecoder(resp.Body).Decode(&rsp); err != nil {
  		return nil, errors.Wrap(err, "decoding")
  	}
  	return rsp.Attrs, nil
  }
docs: // RowAttrDiff returns data from differing blocks on a remote host.