code: func (s *attrStore) Blocks() (blocks []pilosa.AttrBlock, err error) {
  	err = s.db.View(func(tx *bolt.Tx) error {
  		// Wrap cursor to segment by block.
  		cur := newBlockCursor(tx.Bucket([]byte("attrs")).Cursor(), attrBlockSize)
  
  		// Iterate over each block.
  		for cur.nextBlock() {
  			block := pilosa.AttrBlock{ID: cur.blockID()}
  
  			// Compute checksum of every key/value in block.
  			h := xxhash.New()
  			for k, v := cur.next(); k != nil; k, v = cur.next() {
  				// hash function writes don't usually need to be checked
  				_, _ = h.Write(k)
  				_, _ = h.Write(v)
  			}
  			block.Checksum = h.Sum(nil)
  
  			// Append block.
  			blocks = append(blocks, block)
  		}
  		return nil
  	})
  	if err != nil {
  		return nil, errors.Wrap(err, "getting blocks")
  	}
  	return blocks, nil
  }
docs: // Blocks returns a list of all blocks in the store.