code: func findOn(dht *DHT, r map[string]interface{}, target *bitmap,
  	queryType string) error {
  
  	if err := ParseKey(r, "nodes", "string"); err != nil {
  		return err
  	}
  
  	nodes := r["nodes"].(string)
  	if len(nodes)%26 != 0 {
  		return errors.New("the length of nodes should can be divided by 26")
  	}
  
  	hasNew, found := false, false
  	for i := 0; i < len(nodes)/26; i++ {
  		no, _ := newNodeFromCompactInfo(
  			string(nodes[i*26:(i+1)*26]), dht.Network)
  
  		if no.id.RawString() == target.RawString() {
  			found = true
  		}
  
  		if dht.routingTable.Insert(no) {
  			hasNew = true
  		}
  	}
  
  	if found || !hasNew {
  		return nil
  	}
  
  	targetID := target.RawString()
  	for _, no := range dht.routingTable.GetNeighbors(target, dht.K) {
  		switch queryType {
  		case findNodeType:
  			dht.transactionManager.findNode(no, targetID)
  		case getPeersType:
  			dht.transactionManager.getPeers(no, targetID)
  		default:
  			panic("invalid find type")
  		}
  	}
  	return nil
  }
docs: // findOn puts nodes in the response to the routingTable, then if target is in
  // the nodes or all nodes are in the routingTable, it stops. Otherwise it
  // continues to findNode or getPeers.