code: func (api *API) IndexAttrDiff(ctx context.Context, indexName string, blocks []AttrBlock) (map[uint64]map[string]interface{}, error) {
  	span, _ := tracing.StartSpanFromContext(ctx, "API.IndexAttrDiff")
  	defer span.Finish()
  
  	if err := api.validate(apiIndexAttrDiff); err != nil {
  		return nil, errors.Wrap(err, "validating api method")
  	}
  
  	// Retrieve index from holder.
  	index := api.holder.Index(indexName)
  	if index == nil {
  		return nil, newNotFoundError(ErrIndexNotFound)
  	}
  
  	// Retrieve local blocks.
  	localBlocks, err := index.ColumnAttrStore().Blocks()
  	if err != nil {
  		return nil, errors.Wrap(err, "getting blocks")
  	}
  
  	// Read all attributes from all mismatched blocks.
  	attrs := make(map[uint64]map[string]interface{})
  	for _, blockID := range attrBlocks(localBlocks).Diff(blocks) {
  		// Retrieve block data.
  		m, err := index.ColumnAttrStore().BlockData(blockID)
  		if err != nil {
  			return nil, errors.Wrap(err, "getting block")
  		}
  
  		// Copy to index-wide struct.
  		for k, v := range m {
  			attrs[k] = v
  		}
  	}
  	return attrs, nil
  }
docs: // IndexAttrDiff determines the local column attribute data blocks which differ from those provided.