add conf for peer-exchange to not filter peers not found via discv5

This commit is contained in:
Prem Chaitanya Prathi 2025-07-22 13:01:30 +05:30
parent 51b55020ec
commit 51fd75d0c6
6 changed files with 49 additions and 6 deletions

View File

@ -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

View File

@ -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)))

View File

@ -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,

View File

@ -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)

View File

@ -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]

View File

@ -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)