fix: dnsresolver (#3440)

Properly transmit the dns name server list parameter to the peer manager
This commit is contained in:
Ivan FB 2025-06-06 15:50:08 +02:00 committed by GitHub
parent 4f181abe0d
commit 5132510bc6
13 changed files with 27 additions and 87 deletions

View File

@ -96,7 +96,6 @@ when isMainModule:
wakuConf.restPort = conf.restPort wakuConf.restPort = conf.restPort
wakuConf.restAllowOrigin = conf.restAllowOrigin wakuConf.restAllowOrigin = conf.restAllowOrigin
wakuConf.dnsAddrs = true
wakuConf.dnsAddrsNameServers = @[parseIpAddress("8.8.8.8"), parseIpAddress("1.1.1.1")] wakuConf.dnsAddrsNameServers = @[parseIpAddress("8.8.8.8"), parseIpAddress("1.1.1.1")]
wakuConf.shards = @[conf.shard] wakuConf.shards = @[conf.shard]

View File

@ -79,6 +79,7 @@ proc withNetworkConfigurationDetails*(
wssEnabled: bool = false, wssEnabled: bool = false,
wakuFlags = none(CapabilitiesBitfield), wakuFlags = none(CapabilitiesBitfield),
dns4DomainName = none(string), dns4DomainName = none(string),
dnsNameServers = @[parseIpAddress("1.1.1.1"), parseIpAddress("1.0.0.1")],
): WakuNodeBuilderResult {. ): WakuNodeBuilderResult {.
deprecated: "use 'builder.withNetworkConfiguration()' instead" deprecated: "use 'builder.withNetworkConfiguration()' instead"
.} = .} =
@ -94,6 +95,7 @@ proc withNetworkConfigurationDetails*(
wssEnabled = wssEnabled, wssEnabled = wssEnabled,
wakuFlags = wakuFlags, wakuFlags = wakuFlags,
dns4DomainName = dns4DomainName, dns4DomainName = dns4DomainName,
dnsNameServers = dnsNameServers,
) )
builder.withNetworkConfiguration(netConfig) builder.withNetworkConfiguration(netConfig)
ok() ok()
@ -166,6 +168,10 @@ proc build*(builder: WakuNodeBuilder): Result[WakuNode, string] =
if builder.netConfig.isNone(): if builder.netConfig.isNone():
return err("network configuration is required") return err("network configuration is required")
let netConfig = builder.netConfig.get()
if netConfig.dnsNameServers.len == 0:
return err("DNS name servers are required for WakuNode")
if builder.record.isNone(): if builder.record.isNone():
return err("node record is required") return err("node record is required")
@ -196,8 +202,6 @@ proc build*(builder: WakuNodeBuilder): Result[WakuNode, string] =
except CatchableError: except CatchableError:
return err("failed to create switch: " & getCurrentExceptionMsg()) return err("failed to create switch: " & getCurrentExceptionMsg())
let netConfig = builder.netConfig.get()
let peerManager = PeerManager.new( let peerManager = PeerManager.new(
switch = switch, switch = switch,
storage = builder.peerStorage.get(nil), storage = builder.peerStorage.get(nil),

View File

@ -21,9 +21,6 @@ proc withEnabled*(b: var DnsDiscoveryConfBuilder, enabled: bool) =
proc withEnrTreeUrl*(b: var DnsDiscoveryConfBuilder, enrTreeUrl: string) = proc withEnrTreeUrl*(b: var DnsDiscoveryConfBuilder, enrTreeUrl: string) =
b.enrTreeUrl = some(enrTreeUrl) b.enrTreeUrl = some(enrTreeUrl)
proc withNameServers*(b: var DnsDiscoveryConfBuilder, nameServers: seq[IpAddress]) =
b.nameServers = concat(b.nameServers, nameServers)
proc build*(b: DnsDiscoveryConfBuilder): Result[Option[DnsDiscoveryConf], string] = proc build*(b: DnsDiscoveryConfBuilder): Result[Option[DnsDiscoveryConf], string] =
if not b.enabled.get(false): if not b.enabled.get(false):
return ok(none(DnsDiscoveryConf)) return ok(none(DnsDiscoveryConf))

View File

@ -107,7 +107,6 @@ type WakuConfBuilder* = object
extMultiAddrs: seq[string] extMultiAddrs: seq[string]
extMultiAddrsOnly: Option[bool] extMultiAddrsOnly: Option[bool]
dnsAddrs: Option[bool]
dnsAddrsNameServers: seq[IpAddress] dnsAddrsNameServers: seq[IpAddress]
peerPersistence: Option[bool] peerPersistence: Option[bool]
@ -193,9 +192,6 @@ proc withRemotePeerExchangeNode*(
) = ) =
b.remotePeerExchangeNode = some(remotePeerExchangeNode) b.remotePeerExchangeNode = some(remotePeerExchangeNode)
proc withDnsAddrs*(b: var WakuConfBuilder, dnsAddrs: bool) =
b.dnsAddrs = some(dnsAddrs)
proc withPeerPersistence*(b: var WakuConfBuilder, peerPersistence: bool) = proc withPeerPersistence*(b: var WakuConfBuilder, peerPersistence: bool) =
b.peerPersistence = some(peerPersistence) b.peerPersistence = some(peerPersistence)
@ -208,7 +204,7 @@ proc withMaxConnections*(b: var WakuConfBuilder, maxConnections: int) =
proc withDnsAddrsNameServers*( proc withDnsAddrsNameServers*(
b: var WakuConfBuilder, dnsAddrsNameServers: seq[IpAddress] b: var WakuConfBuilder, dnsAddrsNameServers: seq[IpAddress]
) = ) =
b.dnsAddrsNameServers = concat(b.dnsAddrsNameServers, dnsAddrsNameServers) b.dnsAddrsNameServers.insert(dnsAddrsNameServers)
proc withLogLevel*(b: var WakuConfBuilder, logLevel: logging.LogLevel) = proc withLogLevel*(b: var WakuConfBuilder, logLevel: logging.LogLevel) =
b.logLevel = some(logLevel) b.logLevel = some(logLevel)
@ -541,13 +537,6 @@ proc build*(
warn "Whether to only announce external multiaddresses is not specified, defaulting to false" warn "Whether to only announce external multiaddresses is not specified, defaulting to false"
false false
let dnsAddrs =
if builder.dnsAddrs.isSome():
builder.dnsAddrs.get()
else:
warn "Whether to resolve DNS multiaddresses was not specified, defaulting to false."
false
let dnsAddrsNameServers = let dnsAddrsNameServers =
if builder.dnsAddrsNameServers.len != 0: if builder.dnsAddrsNameServers.len != 0:
builder.dnsAddrsNameServers builder.dnsAddrsNameServers
@ -627,7 +616,6 @@ proc build*(
), ),
portsShift: portsShift, portsShift: portsShift,
webSocketConf: webSocketConf, webSocketConf: webSocketConf,
dnsAddrs: dnsAddrs,
dnsAddrsNameServers: dnsAddrsNameServers, dnsAddrsNameServers: dnsAddrsNameServers,
peerPersistence: peerPersistence, peerPersistence: peerPersistence,
peerStoreCapacity: builder.peerStoreCapacity, peerStoreCapacity: builder.peerStoreCapacity,

View File

@ -1,5 +1,5 @@
import chronicles, std/[net, options], results import chronicles, std/[net, options], results
import ../network_conf import ../networks_config
logScope: logScope:
topics = "waku conf builder websocket" topics = "waku conf builder websocket"

View File

@ -245,12 +245,6 @@ type WakuNodeConf* = object
.}: bool .}: bool
## DNS addrs config ## DNS addrs config
dnsAddrs* {.
desc: "Enable resolution of `dnsaddr`, `dns4` or `dns6` multiaddrs",
defaultValue: true,
name: "dns-addrs"
.}: bool
dnsAddrsNameServers* {. dnsAddrsNameServers* {.
desc: desc:
"DNS name server IPs to query for DNS multiaddrs resolution. Argument may be repeated.", "DNS name server IPs to query for DNS multiaddrs resolution. Argument may be repeated.",
@ -567,12 +561,6 @@ with the drawback of consuming some more bandwidth.""",
name: "dns-discovery-url" name: "dns-discovery-url"
.}: string .}: string
dnsDiscoveryNameServers* {.
desc: "DNS name server IPs to query. Argument may be repeated.",
defaultValue: @[parseIpAddress("1.1.1.1"), parseIpAddress("1.0.0.1")],
name: "dns-discovery-name-server"
.}: seq[IpAddress]
## Discovery v5 config ## Discovery v5 config
discv5Discovery* {. discv5Discovery* {.
desc: "Enable discovering nodes via Node Discovery v5.", desc: "Enable discovering nodes via Node Discovery v5.",
@ -962,7 +950,6 @@ proc toWakuConf*(n: WakuNodeConf): ConfResult[WakuConf] =
b.withPeerStoreCapacity(n.peerStoreCapacity.get()) b.withPeerStoreCapacity(n.peerStoreCapacity.get())
b.withPeerPersistence(n.peerPersistence) b.withPeerPersistence(n.peerPersistence)
b.withDnsAddrs(n.dnsAddrs)
b.withDnsAddrsNameServers(n.dnsAddrsNameServers) b.withDnsAddrsNameServers(n.dnsAddrsNameServers)
b.withDns4DomainName(n.dns4DomainName) b.withDns4DomainName(n.dns4DomainName)
b.withCircuitRelayClient(n.isRelayClient) b.withCircuitRelayClient(n.isRelayClient)
@ -1024,7 +1011,6 @@ proc toWakuConf*(n: WakuNodeConf): ConfResult[WakuConf] =
b.dnsDiscoveryConf.withEnabled(n.dnsDiscovery) b.dnsDiscoveryConf.withEnabled(n.dnsDiscovery)
b.dnsDiscoveryConf.withEnrTreeUrl(n.dnsDiscoveryUrl) b.dnsDiscoveryConf.withEnrTreeUrl(n.dnsDiscoveryUrl)
b.dnsDiscoveryConf.withNameServers(n.dnsDiscoveryNameServers)
if n.discv5Discovery.isSome(): if n.discv5Discovery.isSome():
b.discv5Conf.withEnabled(n.discv5Discovery.get()) b.discv5Conf.withEnabled(n.discv5Discovery.get())

View File

@ -12,7 +12,7 @@ import
../waku_enr, ../waku_enr,
../waku_core, ../waku_core,
./waku_conf, ./waku_conf,
./network_conf ./networks_config
proc enrConfiguration*( proc enrConfiguration*(
conf: WakuConf, netConfig: NetConfig conf: WakuConf, netConfig: NetConfig
@ -139,6 +139,7 @@ proc networkConfiguration*(
dns4DomainName = conf.dns4DomainName, dns4DomainName = conf.dns4DomainName,
discv5UdpPort = discv5UdpPort, discv5UdpPort = discv5UdpPort,
wakuFlags = some(wakuFlags), wakuFlags = some(wakuFlags),
dnsNameServers = dnsAddrsNameServers,
) )
return netConfigRes return netConfigRes

View File

@ -1,34 +0,0 @@
import std/[net, options, strutils]
import libp2p/multiaddress
type WebSocketSecureConf* {.requiresInit.} = object
keyPath*: string
certPath*: string
type WebSocketConf* = object
port*: Port
secureConf*: Option[WebSocketSecureConf]
type NetworkConf* = object
natStrategy*: string # TODO: make enum
p2pTcpPort*: Port
dns4DomainName*: Option[string]
p2pListenAddress*: IpAddress
extMultiAddrs*: seq[MultiAddress]
extMultiAddrsOnly*: bool
webSocketConf*: Option[WebSocketConf]
proc validateNoEmptyStrings(networkConf: NetworkConf): Result[void, string] =
if networkConf.dns4DomainName.isSome() and
isEmptyOrWhiteSpace(networkConf.dns4DomainName.get().string):
return err("dns4DomainName is an empty string, set it to none(string) instead")
if networkConf.webSocketConf.isSome() and
networkConf.webSocketConf.get().secureConf.isSome():
let secureConf = networkConf.webSocketConf.get().secureConf.get()
if isEmptyOrWhiteSpace(secureConf.keyPath):
return err("websocket.secureConf.keyPath is an empty string")
if isEmptyOrWhiteSpace(secureConf.certPath):
return err("websocket.secureConf.certPath is an empty string")
return ok()

View File

@ -1,6 +1,14 @@
{.push raises: [].} {.push raises: [].}
import stint import stint, std/[nativesockets, options]
type WebSocketSecureConf* {.requiresInit.} = object
keyPath*: string
certPath*: string
type WebSocketConf* = object
port*: Port
secureConf*: Option[WebSocketSecureConf]
# TODO: Rename this type to match file name # TODO: Rename this type to match file name

View File

@ -67,17 +67,6 @@ proc initNode(
## file. Optionally include persistent peer storage. ## file. Optionally include persistent peer storage.
## No protocols are mounted yet. ## No protocols are mounted yet.
var dnsResolver: DnsResolver
if conf.dnsAddrs:
# Support for DNS multiaddrs
var nameServers: seq[TransportAddress]
for ip in conf.dnsAddrsNameServers:
nameServers.add(initTAddress(ip, Port(53))) # Assume all servers use port 53
dnsResolver = DnsResolver.new(nameServers)
var node: WakuNode
let pStorage = let pStorage =
if peerStore.isNone(): if peerStore.isNone():
nil nil
@ -91,6 +80,9 @@ proc initNode(
else: else:
(none(string), none(string)) (none(string), none(string))
let nameResolver =
DnsResolver.new(conf.dnsAddrsNameServers.mapIt(initTAddress(it, Port(53))))
# Build waku node instance # Build waku node instance
var builder = WakuNodeBuilder.init() var builder = WakuNodeBuilder.init()
builder.withRng(rng) builder.withRng(rng)
@ -102,7 +94,7 @@ proc initNode(
maxConnections = some(conf.maxConnections.int), maxConnections = some(conf.maxConnections.int),
secureKey = secureKey, secureKey = secureKey,
secureCert = secureCert, secureCert = secureCert,
nameResolver = dnsResolver, nameResolver = nameResolver,
sendSignedPeerRecord = conf.relayPeerExchange, sendSignedPeerRecord = conf.relayPeerExchange,
# We send our own signed peer record when peer exchange enabled # We send our own signed peer record when peer exchange enabled
agentString = some(conf.agentString), agentString = some(conf.agentString),
@ -132,7 +124,7 @@ proc initNode(
builder.withRateLimit(conf.rateLimits) builder.withRateLimit(conf.rateLimits)
builder.withCircuitRelay(relay) builder.withCircuitRelay(relay)
node = let node =
?builder.build().mapErr( ?builder.build().mapErr(
proc(err: string): string = proc(err: string): string =
"failed to create waku node instance: " & err "failed to create waku node instance: " & err

View File

@ -13,7 +13,7 @@ import
../node/waku_metrics, ../node/waku_metrics,
../common/logging, ../common/logging,
../waku_enr/capabilities, ../waku_enr/capabilities,
./network_conf ./networks_config
export RlnRelayConf, RlnRelayCreds, RestServerConf, Discv5Conf, MetricsServerConf export RlnRelayConf, RlnRelayCreds, RestServerConf, Discv5Conf, MetricsServerConf
@ -95,7 +95,6 @@ type WakuConf* {.requiresInit.} = ref object
webSocketConf*: Option[WebSocketConf] webSocketConf*: Option[WebSocketConf]
portsShift*: uint16 portsShift*: uint16
dnsAddrs*: bool
dnsAddrsNameServers*: seq[IpAddress] dnsAddrsNameServers*: seq[IpAddress]
networkConf*: NetworkConfig networkConf*: NetworkConfig
wakuFlags*: CapabilitiesBitfield wakuFlags*: CapabilitiesBitfield

View File

@ -78,7 +78,7 @@ proc init*(
discv5UdpPort = none(Port), discv5UdpPort = none(Port),
clusterId: uint16 = 0, clusterId: uint16 = 0,
wakuFlags = none(CapabilitiesBitfield), wakuFlags = none(CapabilitiesBitfield),
dnsNameServers = newSeq[IpAddress](), dnsNameServers = @[parseIpAddress("1.1.1.1"), parseIpAddress("1.0.0.1")],
): NetConfigResult = ): NetConfigResult =
## Initialize and validate waku node network configuration ## Initialize and validate waku node network configuration

View File

@ -1048,7 +1048,7 @@ proc new*(
maxFailedAttempts = MaxFailedAttempts, maxFailedAttempts = MaxFailedAttempts,
colocationLimit = DefaultColocationLimit, colocationLimit = DefaultColocationLimit,
shardedPeerManagement = false, shardedPeerManagement = false,
dnsNameServers = newSeq[IpAddress](), dnsNameServers = @[parseIpAddress("1.1.1.1"), parseIpAddress("1.0.0.1")],
): PeerManager {.gcsafe.} = ): PeerManager {.gcsafe.} =
let capacity = switch.peerStore.capacity let capacity = switch.peerStore.capacity
let maxConnections = switch.connManager.inSema.size let maxConnections = switch.connManager.inSema.size