code: func (p *peer) broadcast() {
  	for {
  		select {
  		case txs := <-p.queuedTxs:
  			if err := p.SendTransactions(txs); err != nil {
  				return
  			}
  			p.Log().Trace("Broadcast transactions", "count", len(txs))
  
  		case prop := <-p.queuedProps:
  			if err := p.SendNewBlock(prop.block, prop.td); err != nil {
  				return
  			}
  			p.Log().Trace("Propagated block", "number", prop.block.Number(), "hash", prop.block.Hash(), "td", prop.td)
  
  		case block := <-p.queuedAnns:
  			if err := p.SendNewBlockHashes([]common.Hash{block.Hash()}, []uint64{block.NumberU64()}); err != nil {
  				return
  			}
  			p.Log().Trace("Announced block", "number", block.Number(), "hash", block.Hash())
  
  		case <-p.term:
  			return
  		}
  	}
  }
docs: // broadcast is a write loop that multiplexes block propagations, announcements
  // and transaction broadcasts into the remote peer. The goal is to have an async
  // writer that does not lock up node internals.