From 8ef769e4fd4afa2e13287f76a73109cfbfd7c3a0 Mon Sep 17 00:00:00 2001 From: SionoiS Date: Fri, 1 May 2026 09:40:41 -0400 Subject: [PATCH] makefile chat2disco update --- Makefile | 4 + apps/chat2disco/chat2disco.nim | 105 ++++---------------------- apps/chat2disco/config_chat2disco.nim | 42 ----------- config.nims | 2 +- waku.nimble | 6 +- waku/discovery/waku_kademlia.nim | 6 +- 6 files changed, 27 insertions(+), 138 deletions(-) diff --git a/Makefile b/Makefile index be9e14027..2740657ad 100644 --- a/Makefile +++ b/Makefile @@ -240,6 +240,10 @@ chat2mix: | $(NIMBLEDEPS_STAMP) build deps librln echo -e $(BUILD_MSG) "build/$@" && \ nimble chat2mix +chat2disco: | $(NIMBLEDEPS_STAMP) build deps librln + echo -e $(BUILD_MSG) "build/$@" && \ + nimble chat2disco + rln-db-inspector: | $(NIMBLEDEPS_STAMP) build deps librln echo -e $(BUILD_MSG) "build/$@" && \ nimble rln_db_inspector diff --git a/apps/chat2disco/chat2disco.nim b/apps/chat2disco/chat2disco.nim index 26e572590..be2f14cff 100644 --- a/apps/chat2disco/chat2disco.nim +++ b/apps/chat2disco/chat2disco.nim @@ -7,7 +7,7 @@ when not (compileOption("threads")): {.push raises: [].} -import std/[strformat, strutils, times, options, random, sequtils, tables] +import std/[strformat, strutils, times, options, sequtils, tables] import confutils, chronicles, @@ -27,14 +27,12 @@ import peerinfo, peerid, protobuf/minprotobuf, - nameresolving/dnsresolver, extended_peer_record, ] import waku/[ waku_core, waku_enr, - discovery/waku_dnsdisc, discovery/waku_kademlia, waku_node, node/waku_metrics, @@ -42,7 +40,6 @@ import factory/builder, common/utils/nat, waku_relay, - waku_store/common, ], ./config_chat2disco @@ -314,7 +311,7 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = var enrBuilder = EnrBuilder.init(nodeKey) let record = enrBuilder.build().valueOr: - error "failed to create enr record", error = error + error "failed to create enr record", error quit(QuitFailure) let node = block: @@ -337,36 +334,31 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = if conf.relay: (await node.mountRelay()).isOkOr: - echo "failed to mount relay: " & error - return + error "failed to mount relay", error + quit(QuitFailure) await node.mountLibp2pPing() - # Setup kademlia discovery if bootstrap nodes are provided - var providedServices: seq[ServiceInfo] = @[] - + var kadBootstrapPeers: seq[(PeerId, seq[MultiAddress])] = @[] if conf.kadBootstrapNodes.len > 0: - var kadBootstrapPeers: seq[(PeerId, seq[MultiAddress])] for nodeStr in conf.kadBootstrapNodes: let (peerId, ma) = parseFullAddress(nodeStr).valueOr: error "Failed to parse kademlia bootstrap node", node = nodeStr, error = error continue kadBootstrapPeers.add((peerId, @[ma])) - if kadBootstrapPeers.len > 0: - node.wakuKademlia = WakuKademlia.new( - node.switch, node.peerManager, kadBootstrapPeers, providedServices - ) - else: - # Create as seed node (no bootstrap) so we can still advertise services - node.wakuKademlia = - WakuKademlia.new(node.switch, node.peerManager, @[], providedServices) + node.wakuKademlia = WakuKademlia.new(node.switch, node.peerManager, kadBootstrapPeers) + let catchRes = catch: + node.switch.mount(node.wakuKademlia.protocol) + + if catchRes.isErr(): + error "failed to mount kademlia discovery", error = catchRes.error.msg + quit(QuitFailure) + + # node start include kademlia await node.start() - if not node.wakuKademlia.isNil(): - node.wakuKademlia.start() - let nick = await readNick(transp) echo "Welcome, " & nick & "!" @@ -379,79 +371,10 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = prompt: false, ) - if conf.staticnodes.len > 0: - echo "Connecting to static peers..." - await node.connectToNodes(conf.staticnodes) - - var dnsDiscoveryUrl = none(string) - - if conf.fleet != Fleet.none: - echo "Connecting to " & $conf.fleet & " fleet using DNS discovery..." - - if conf.fleet == Fleet.test: - dnsDiscoveryUrl = some( - "enrtree://AOGYWMBYOUIMOENHXCHILPKY3ZRFEULMFI4DOM442QSZ73TT2A7VI@test.waku.nodes.status.im" - ) - else: - dnsDiscoveryUrl = some( - "enrtree://AIRVQ5DDA4FFWLRBCHJWUWOO6X6S4ZTZ5B667LQ6AJU6PEYDLRD5O@sandbox.waku.nodes.status.im" - ) - elif conf.dnsDiscoveryUrl != "": - info "Discovering nodes using Waku DNS discovery", url = conf.dnsDiscoveryUrl - dnsDiscoveryUrl = some(conf.dnsDiscoveryUrl) - - var discoveredNodes: seq[RemotePeerInfo] - - if dnsDiscoveryUrl.isSome: - var nameServers: seq[TransportAddress] - for ip in conf.dnsAddrsNameServers: - nameServers.add(initTAddress(ip, Port(53))) - - let dnsResolver = DnsResolver.new(nameServers) - - proc resolver(domain: string): Future[string] {.async, gcsafe.} = - trace "resolving", domain = domain - let resolved = await dnsResolver.resolveTxt(domain) - return resolved[0] - - let wakuDnsDiscovery = WakuDnsDiscovery.init(dnsDiscoveryUrl.get(), resolver) - if wakuDnsDiscovery.isOk: - let discoveredPeers = await wakuDnsDiscovery.get().findPeers() - if discoveredPeers.isOk: - info "Connecting to discovered peers" - discoveredNodes = discoveredPeers.get() - echo "Discovered and connecting to " & $discoveredNodes - waitFor chat.node.connectToNodes(discoveredNodes) - else: - warn "Failed to find peers via DNS discovery", error = discoveredPeers.error - else: - warn "Failed to init Waku DNS discovery", error = wakuDnsDiscovery.error - let peerInfo = node.switch.peerInfo let listenStr = $peerInfo.addrs[0] & "/p2p/" & $peerInfo.peerId echo &"Listening on\n {listenStr}" - if (conf.storenode != "") or (conf.store == true): - await node.mountStore() - - var storenode: Option[RemotePeerInfo] - - if conf.storenode != "": - let peerInfo = parsePeerInfo(conf.storenode) - if peerInfo.isOk(): - storenode = some(peerInfo.value) - else: - error "Incorrect conf.storenode", error = peerInfo.error - elif discoveredNodes.len > 0: - echo "Store enabled, but no store nodes configured. Choosing one at random from discovered peers" - storenode = some(discoveredNodes[rand(0 .. len(discoveredNodes) - 1)]) - - if storenode.isSome(): - echo "Connecting to storenode: " & $(storenode.get()) - - node.mountStoreClient() - node.peerManager.addServicePeer(storenode.get(), WakuStoreCodec) - # Subscribe to relay topic if conf.relay: proc handler(topic: PubsubTopic, msg: WakuMessage): Future[void] {.async, gcsafe.} = diff --git a/apps/chat2disco/config_chat2disco.nim b/apps/chat2disco/config_chat2disco.nim index c703641b7..86b505bd8 100644 --- a/apps/chat2disco/config_chat2disco.nim +++ b/apps/chat2disco/config_chat2disco.nim @@ -13,15 +13,8 @@ import waku/waku_core const defaultMetricsAddress* = parseIpAddress("127.0.0.1") - defaultDnsResolver1* = parseIpAddress("1.1.1.1") - defaultDnsResolver2* = parseIpAddress("1.0.0.1") type - Fleet* = enum - none - prod - test - Chat2DiscoConf* = object ## General node config logLevel* {. desc: "Sets the log level.", defaultValue: LogLevel.INFO, name: "log-level" @@ -58,11 +51,6 @@ type desc: "Enable relay protocol: true|false", defaultValue: true, name: "relay" .}: bool - staticnodes* {. - desc: "Peer multiaddr to directly connect with. Argument may be repeated.", - name: "staticnode" - .}: seq[string] - keepAlive* {. desc: "Enable keep-alive for idle connections: true|false", defaultValue: false, @@ -83,15 +71,6 @@ type name: "shard" .}: seq[uint16] - ## Store config - store* {. - desc: "Enable store protocol: true|false", defaultValue: true, name: "store" - .}: bool - - storenode* {. - desc: "Peer multiaddr to query for storage.", defaultValue: "", name: "storenode" - .}: string - ## Metrics config metricsServer* {. desc: "Enable the metrics server: true|false", @@ -117,28 +96,7 @@ type name: "metrics-logging" .}: bool - ## DNS discovery config - dnsDiscoveryUrl* {. - desc: "URL for DNS node list in format 'enrtree://@'", - defaultValue: "", - name: "dns-discovery-url" - .}: string - - dnsAddrsNameServers* {. - desc: - "DNS name server IPs to query for DNS multiaddrs resolution. Argument may be repeated.", - defaultValue: @[defaultDnsResolver1, defaultDnsResolver2], - name: "dns-addrs-name-server" - .}: seq[IpAddress] - ## Chat2 configuration - fleet* {. - desc: - "Select the fleet to connect to. This sets the DNS discovery URL to the selected fleet.", - defaultValue: Fleet.prod, - name: "fleet" - .}: Fleet - contentTopic* {. desc: "Content topic for chat messages.", defaultValue: "/chat2disco/1/default/proto", diff --git a/config.nims b/config.nims index 0a61a086d..796716d3b 100644 --- a/config.nims +++ b/config.nims @@ -120,7 +120,7 @@ if defined(android): switch("passL", "--sysroot=" & sysRoot) switch("cincludes", sysRoot & "/usr/include/") # begin Nimble config (version 2) +--noNimblePath when withDir(thisDir(), system.fileExists("nimble.paths")): - --noNimblePath include "nimble.paths" # end Nimble config diff --git a/waku.nimble b/waku.nimble index 00be69426..bd9a442ed 100644 --- a/waku.nimble +++ b/waku.nimble @@ -433,10 +433,14 @@ task chat2mix, "Build example Waku chat mix usage": # -d:ssl - cause unlisted exception error in libp2p/utility... task chat2disco, "Build example Waku chat with service discovery": + # NOTE For debugging, set debug level. For chat usage we want minimal log + # output to STDOUT. Can be fixed by redirecting logs to file (e.g.) + #buildBinary name, "examples/", "-d:chronicles_log_level=WARN" + let name = "chat2disco" buildBinary name, "apps/chat2disco/", - "-d:chronicles_sinks=textlines[file] -d:chronicles_log_level=DEBUG " + "-d:chronicles_sinks=textlines -d:chronicles_log_level=DEBUG " task chat2bridge, "Build chat2bridge": let name = "chat2bridge" diff --git a/waku/discovery/waku_kademlia.nim b/waku/discovery/waku_kademlia.nim index d07632e7b..8c3caa026 100644 --- a/waku/discovery/waku_kademlia.nim +++ b/waku/discovery/waku_kademlia.nim @@ -126,7 +126,7 @@ proc lookup*( proc registerLookupService*(self: WakuKademlia, serviceId: string) = if serviceId notin self.discoveredServices: - self.protocol.startDiscovering(serviceId) + discard self.protocol.startDiscovering(serviceId) self.discoveredServices.add(serviceId) proc advertiseService*(self: WakuKademlia, service: ServiceInfo) = @@ -163,8 +163,8 @@ proc new*( T: type WakuKademlia, switch: Switch, peerManager: PeerManager, - bootstrapNodes: seq[(PeerId, seq[MultiAddress])], - providedServices: var seq[ServiceInfo], + bootstrapNodes: seq[(PeerId, seq[MultiAddress])] = @[], + providedServices: seq[ServiceInfo] = @[], loopInterval: Duration = DefaultKademliaDiscoveryInterval, xprPublishing: bool = false, ): T =