code: func (n *NetStore) get(ctx context.Context, ref Address) (Chunk, func(context.Context) (Chunk, error), error) {
  	n.mu.Lock()
  	defer n.mu.Unlock()
  
  	chunk, err := n.store.Get(ctx, ref)
  	if err != nil {
  		// TODO: Fix comparison - we should be comparing against leveldb.ErrNotFound, this error should be wrapped.
  		if err != ErrChunkNotFound && err != leveldb.ErrNotFound {
  			log.Debug("Received error from LocalStore other than ErrNotFound", "err", err)
  		}
  		// The chunk is not available in the LocalStore, let's get the fetcher for it, or create a new one
  		// if it doesn't exist yet
  		f := n.getOrCreateFetcher(ctx, ref)
  		// If the caller needs the chunk, it has to use the returned fetch function to get it
  		return nil, f.Fetch, nil
  	}
  
  	return chunk, nil, nil
  }
docs: // get attempts at retrieving the chunk from LocalStore
  // If it is not found then using getOrCreateFetcher:
  //     1. Either there is already a fetcher to retrieve it
  //     2. A new fetcher is created and saved in the fetchers cache
  // From here on, all Get will hit on this fetcher until the chunk is delivered
  // or all fetcher contexts are done.
  // It returns a chunk, a fetcher function and an error
  // If chunk is nil, the returned fetch function needs to be called with a context to return the chunk.