code: func (tab *Table) addVerifiedNode(n *node) {
  	if !tab.isInitDone() {
  		return
  	}
  	if n.ID() == tab.self().ID() {
  		return
  	}
  
  	tab.mutex.Lock()
  	defer tab.mutex.Unlock()
  	b := tab.bucket(n.ID())
  	if tab.bumpInBucket(b, n) {
  		// Already in bucket, moved to front.
  		return
  	}
  	if len(b.entries) >= bucketSize {
  		// Bucket full, maybe add as replacement.
  		tab.addReplacement(b, n)
  		return
  	}
  	if !tab.addIP(b, n.IP()) {
  		// Can't add: IP limit reached.
  		return
  	}
  	// Add to front of bucket.
  	b.entries, _ = pushNode(b.entries, n, bucketSize)
  	b.replacements = deleteNode(b.replacements, n)
  	n.addedAt = time.Now()
  	if tab.nodeAddedHook != nil {
  		tab.nodeAddedHook(n)
  	}
  }
docs: // addVerifiedNode adds a node whose existence has been verified recently to the front of a
  // bucket. If the node is already in the bucket, it is moved to the front. If the bucket
  // has no space, the node is added to the replacements list.
  //
  // There is an additional safety measure: if the table is still initializing the node
  // is not added. This prevents an attack where the table could be filled by just sending
  // ping repeatedly.
  //
  // The caller must not hold tab.mutex.