code: func (d *Downloader) fetchBodies(from uint64) error {
  	log.Debug("Downloading block bodies", "origin", from)
  
  	var (
  		deliver = func(packet dataPack) (int, error) {
  			pack := packet.(*bodyPack)
  			return d.queue.DeliverBodies(pack.peerID, pack.transactions, pack.uncles)
  		}
  		expire   = func() map[string]int { return d.queue.ExpireBodies(d.requestTTL()) }
  		fetch    = func(p *peerConnection, req *fetchRequest) error { return p.FetchBodies(req) }
  		capacity = func(p *peerConnection) int { return p.BlockCapacity(d.requestRTT()) }
  		setIdle  = func(p *peerConnection, accepted int) { p.SetBodiesIdle(accepted) }
  	)
  	err := d.fetchParts(errCancelBodyFetch, d.bodyCh, deliver, d.bodyWakeCh, expire,
  		d.queue.PendingBlocks, d.queue.InFlightBlocks, d.queue.ShouldThrottleBlocks, d.queue.ReserveBodies,
  		d.bodyFetchHook, fetch, d.queue.CancelBodies, capacity, d.peers.BodyIdlePeers, setIdle, "bodies")
  
  	log.Debug("Block body download terminated", "err", err)
  	return err
  }
docs: // fetchBodies iteratively downloads the scheduled block bodies, taking any
  // available peers, reserving a chunk of blocks for each, waiting for delivery
  // and also periodically checking for timeouts.