From 51fd75d0c6bfe787ada870e0808741b9b047543c Mon Sep 17 00:00:00 2001 From: Prem Chaitanya Prathi Date: Tue, 22 Jul 2025 13:01:30 +0530 Subject: [PATCH] add conf for peer-exchange to not filter peers not found via discv5 --- waku/factory/conf_builder/conf_builder.nim | 5 +++-- .../peer_exchange_conf_builder.nim | 21 +++++++++++++++++++ .../conf_builder/waku_conf_builder.nim | 8 ++++++- waku/factory/external_config.nim | 8 +++++++ waku/factory/waku_conf.nim | 4 ++++ waku/waku_peer_exchange/protocol.nim | 9 +++++--- 6 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 waku/factory/conf_builder/peer_exchange_conf_builder.nim diff --git a/waku/factory/conf_builder/conf_builder.nim b/waku/factory/conf_builder/conf_builder.nim index 41e922e3d..158beeeae 100644 --- a/waku/factory/conf_builder/conf_builder.nim +++ b/waku/factory/conf_builder/conf_builder.nim @@ -9,10 +9,11 @@ import ./web_socket_conf_builder, ./metrics_server_conf_builder, ./rln_relay_conf_builder, - ./mix_conf_builder + ./mix_conf_builder, + ./peer_exchange_conf_builder export waku_conf_builder, filter_service_conf_builder, store_sync_conf_builder, store_service_conf_builder, rest_server_conf_builder, dns_discovery_conf_builder, discv5_conf_builder, web_socket_conf_builder, metrics_server_conf_builder, - rln_relay_conf_builder, mix_conf_builder + rln_relay_conf_builder, mix_conf_builder, peer_exchange_conf_builder diff --git a/waku/factory/conf_builder/peer_exchange_conf_builder.nim b/waku/factory/conf_builder/peer_exchange_conf_builder.nim new file mode 100644 index 000000000..800bec0d2 --- /dev/null +++ b/waku/factory/conf_builder/peer_exchange_conf_builder.nim @@ -0,0 +1,21 @@ +import chronicles, std/options, results +import ../waku_conf + +logScope: + topics = "waku conf builder peer exchange" + +################################## +## Peer Exchange Config Builder ## +################################## +type PeerExchangeConfBuilder* = object + strictPeerExchangeFiltering*: bool + +proc init*(T: type PeerExchangeConfBuilder): PeerExchangeConfBuilder = + PeerExchangeConfBuilder() + +proc withStrictPeerFiltering*(b: var PeerExchangeConfBuilder, enabled: bool) = + b.strictPeerExchangeFiltering = enabled + +proc build*(b: PeerExchangeConfBuilder): Result[Option[PeerExchangeConf], string] = + return + ok(some(PeerExchangeConf(strictPeerExchangeFilter: b.strictPeerExchangeFiltering))) diff --git a/waku/factory/conf_builder/waku_conf_builder.nim b/waku/factory/conf_builder/waku_conf_builder.nim index f8dc90031..639fc7ae6 100644 --- a/waku/factory/conf_builder/waku_conf_builder.nim +++ b/waku/factory/conf_builder/waku_conf_builder.nim @@ -24,7 +24,8 @@ import ./web_socket_conf_builder, ./metrics_server_conf_builder, ./rln_relay_conf_builder, - ./mix_conf_builder + ./mix_conf_builder, + ./peer_exchange_conf_builder logScope: topics = "waku conf builder" @@ -75,6 +76,7 @@ type WakuConfBuilder* = object storeServiceConf*: StoreServiceConfBuilder mixConf*: MixConfBuilder webSocketConf*: WebSocketConfBuilder + peerExchangeConf*: PeerExchangeConfBuilder # End conf builders relay: Option[bool] lightPush: Option[bool] @@ -479,6 +481,9 @@ proc build*( let mixConf = builder.mixConf.build().valueOr: return err("Mix Conf building failed: " & $error) + let peerExchangeConf = builder.peerExchangeConf.build().valueOr: + return err("Peer Exchange Conf building failed: " & $error) + let webSocketConf = builder.webSocketConf.build().valueOr: return err("WebSocket Conf building failed: " & $error) # End - Build sub-configs @@ -599,6 +604,7 @@ proc build*( restServerConf: restServerConf, dnsDiscoveryConf: dnsDiscoveryConf, mixConf: mixConf, + peerExchangeConf: peerExchangeConf, # end confs nodeKey: nodeKey, clusterId: clusterId, diff --git a/waku/factory/external_config.nim b/waku/factory/external_config.nim index d23f292c1..a5823b65b 100644 --- a/waku/factory/external_config.nim +++ b/waku/factory/external_config.nim @@ -611,6 +611,12 @@ with the drawback of consuming some more bandwidth.""", name: "peer-exchange" .}: bool + strictPeerExchangeFilter* {. + desc: "Enable/disable strict filtering of peers to be served via peer-exchange", + defaultValue: true, + name: "peer-exchange-strict-filter" + .}: bool + peerExchangeNode* {. desc: "Peer multiaddr to send peer exchange requests to. (enables peer exchange protocol requester side)", @@ -1023,6 +1029,8 @@ proc toWakuConf*(n: WakuNodeConf): ConfResult[WakuConf] = b.discv5Conf.withBitsPerHop(n.discv5BitsPerHop) b.withPeerExchange(n.peerExchange) + if n.peerExchange: + b.peerExchangeConf.withStrictPeerFiltering(n.strictPeerExchangeFilter) b.withRendezvous(n.rendezvous) diff --git a/waku/factory/waku_conf.nim b/waku/factory/waku_conf.nim index eed02fba6..61b4e907c 100644 --- a/waku/factory/waku_conf.nim +++ b/waku/factory/waku_conf.nim @@ -40,6 +40,9 @@ type MixConf* = ref object mixKey*: Curve25519Key mixPubKey*: Curve25519Key +type PeerExchangeConf* = object + strictPeerExchangeFilter*: bool + type StoreServiceConf* {.requiresInit.} = object dbMigration*: bool dbURl*: string @@ -98,6 +101,7 @@ type WakuConf* {.requiresInit.} = ref object metricsServerConf*: Option[MetricsServerConf] webSocketConf*: Option[WebSocketConf] mixConf*: Option[MixConf] + peerExchangeConf*: Option[PeerExchangeConf] portsShift*: uint16 dnsAddrsNameServers*: seq[IpAddress] diff --git a/waku/waku_peer_exchange/protocol.nim b/waku/waku_peer_exchange/protocol.nim index 14de77c67..e7ce74dbc 100644 --- a/waku/waku_peer_exchange/protocol.nim +++ b/waku/waku_peer_exchange/protocol.nim @@ -58,6 +58,7 @@ type # todo: next step: ring buffer; future: implement cache satisfying https://rfc.vac.dev/spec/34/ requestRateLimiter*: RequestRateLimiter pxLoopHandle*: Future[void] + strictPeerFilter*: bool proc request*( wpx: WakuPeerExchange, numPeers = DefaultPXNumPeersReq, conn: Connection @@ -201,8 +202,8 @@ proc getEnrsFromCache( # return numPeers or less if cache is smaller return shuffledCache[0 ..< min(shuffledCache.len.int, numPeers.int)] -proc poolFilter*(cluster: Option[uint16], peer: RemotePeerInfo): bool = - if peer.origin != Discv5: +proc poolFilter*(cluster: Option[uint16], strictPeerFilter : bool ,peer: RemotePeerInfo): bool = + if peer.origin != Discv5 and strictPeerFilter: debug "peer not from discv5", peer = $peer, origin = $peer.origin return false @@ -219,7 +220,7 @@ proc poolFilter*(cluster: Option[uint16], peer: RemotePeerInfo): bool = proc populateEnrCache(wpx: WakuPeerExchange) = # share only peers that i) are reachable ii) come from discv5 iii) share cluster let withEnr = wpx.peerManager.switch.peerStore.getReachablePeers().filterIt( - poolFilter(wpx.cluster, it) + poolFilter(wpx.cluster, wpx.strictPeerFilter, it) ) # either what we have or max cache size @@ -314,11 +315,13 @@ proc new*( peerManager: PeerManager, cluster: Option[uint16] = none(uint16), rateLimitSetting: Option[RateLimitSetting] = none[RateLimitSetting](), + strictPeerFilter: bool = false, ): T = let wpx = WakuPeerExchange( peerManager: peerManager, cluster: cluster, requestRateLimiter: newRequestRateLimiter(rateLimitSetting), + strictPeerFilter: strictPeerFilter ) wpx.initProtocolHandler() setServiceLimitMetric(WakuPeerExchangeCodec, rateLimitSetting)