code: func (h *Hive) Run(p *BzzPeer) error {
  	h.trackPeer(p)
  	defer h.untrackPeer(p)
  
  	dp := NewPeer(p, h.Kademlia)
  	depth, changed := h.On(dp)
  	// if we want discovery, advertise change of depth
  	if h.Discovery {
  		if changed {
  			// if depth changed, send to all peers
  			NotifyDepth(depth, h.Kademlia)
  		} else {
  			// otherwise just send depth to new peer
  			dp.NotifyDepth(depth)
  		}
  		NotifyPeer(p.BzzAddr, h.Kademlia)
  	}
  	defer h.Off(dp)
  	return dp.Run(dp.HandleMsg)
  }
docs: // Run protocol run function