code: func (b *blockManager) NotificationsSinceHeight(
  	height uint32) ([]blockntfns.BlockNtfn, uint32, error) {
  
  	b.newFilterHeadersMtx.RLock()
  	defer b.newFilterHeadersMtx.RUnlock()
  
  	bestHeight := b.filterHeaderTip
  
  	// If a height of 0 is provided by the caller, then a backlog of
  	// notifications is not needed.
  	if height == 0 {
  		return nil, bestHeight, nil
  	}
  
  	// If the best height matches the filter header tip, then we're done and
  	// don't need to proceed any further.
  	if bestHeight == height {
  		return nil, bestHeight, nil
  	}
  
  	// If the request has a height later than a height we've yet to come
  	// across in the chain, we'll return an error to indicate so to the
  	// caller.
  	if height > bestHeight {
  		return nil, 0, fmt.Errorf("request with height %d is greater "+
  			"than best height known %d", height, bestHeight)
  	}
  
  	// Otherwise, we need to read block headers from disk to deliver a
  	// backlog to the caller before we proceed.
  	blocks := make([]blockntfns.BlockNtfn, 0, bestHeight-height)
  	for i := height + 1; i <= bestHeight; i++ {
  		header, err := b.server.BlockHeaders.FetchHeaderByHeight(i)
  		if err != nil {
  			return nil, 0, err
  		}
  
  		blocks = append(blocks, blockntfns.NewBlockConnected(*header, i))
  	}
  
  	return blocks, bestHeight, nil
  }
docs: // NotificationsSinceHeight returns a backlog of block notifications starting
  // from the given height to the tip of the chain. When providing a height of 0,
  // a backlog will not be delivered.