code: func New(config *Config) *DHT {
  	if config == nil {
  		config = NewStandardConfig()
  	}
  
  	node, err := newNode(randomString(20), config.Network, config.Address)
  	if err != nil {
  		panic(err)
  	}
  
  	d := &DHT{
  		Config:       config,
  		node:         node,
  		blackList:    newBlackList(config.BlackListMaxSize),
  		packets:      make(chan packet, config.PacketJobLimit),
  		workerTokens: make(chan struct{}, config.PacketWorkerLimit),
  	}
  
  	for _, ip := range config.BlockedIPs {
  		d.blackList.insert(ip, -1)
  	}
  
  	go func() {
  		for _, ip := range getLocalIPs() {
  			d.blackList.insert(ip, -1)
  		}
  
  		ip, err := getRemoteIP()
  		if err != nil {
  			d.blackList.insert(ip, -1)
  		}
  	}()
  
  	return d
  }
docs: // New returns a DHT pointer. If config is nil, then config will be set to
  // the default config.