From 200a11da09b5acc2f11de5d9a6253637ae1a365a Mon Sep 17 00:00:00 2001 From: Simon-Pierre Vivier Date: Mon, 6 Nov 2023 07:31:36 -0500 Subject: [PATCH] feat(discv5): filter out peers without any listed capability (#2186) --- tests/test_waku_discv5.nim | 3 +++ waku/waku_discv5.nim | 24 +++++++++--------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/tests/test_waku_discv5.nim b/tests/test_waku_discv5.nim index bebdb5fe3..9a7a49a90 100644 --- a/tests/test_waku_discv5.nim +++ b/tests/test_waku_discv5.nim @@ -320,6 +320,7 @@ procSuite "Waku Discovery v5": var builder = EnrBuilder.init(enrPrivKey, seqNum = enrSeqNum) require builder.withWakuRelaySharding(shardsTopics).isOk() + builder.withWakuCapabilities(Relay) let recordRes = builder.build() require recordRes.isOk() @@ -338,6 +339,7 @@ procSuite "Waku Discovery v5": var builder = EnrBuilder.init(enrPrivKey, seqNum = enrSeqNum) require builder.withWakuRelaySharding(shardsTopics).isOk() + builder.withWakuCapabilities(Relay) let recordRes = builder.build() require recordRes.isOk() @@ -356,6 +358,7 @@ procSuite "Waku Discovery v5": var builder = EnrBuilder.init(enrPrivKey, seqNum = enrSeqNum) require builder.withWakuRelaySharding(shardsTopics).isOk() + builder.withWakuCapabilities(Relay) let recordRes = builder.build() require recordRes.isOk() diff --git a/waku/waku_discv5.nim b/waku/waku_discv5.nim index 6a9fe094f..8456cab42 100644 --- a/waku/waku_discv5.nim +++ b/waku/waku_discv5.nim @@ -52,25 +52,19 @@ type WakuDiscoveryV5* = ref object proc shardingPredicate*(record: Record): Option[WakuDiscv5Predicate] = ## Filter peers based on relay sharding information + let typedRecord = record.toTyped().valueOr: + debug "peer filtering failed", reason=error + return none(WakuDiscv5Predicate) - let typeRecordRes = record.toTyped() - let typedRecord = - if typeRecordRes.isErr(): - debug "peer filtering failed", reason= $typeRecordRes.error - return none(WakuDiscv5Predicate) - else: typeRecordRes.get() - - let nodeShardOp = typedRecord.relaySharding() - let nodeShard = - if nodeShardOp.isNone(): - debug "no relay sharding information, peer filtering disabled" - return none(WakuDiscv5Predicate) - else: nodeShardOp.get() - + let nodeShard = typedRecord.relaySharding().valueOr: + debug "no relay sharding information, peer filtering disabled" + return none(WakuDiscv5Predicate) + debug "peer filtering updated" let predicate = proc(record: waku_enr.Record): bool = - nodeShard.shardIds.anyIt(record.containsShard(nodeShard.clusterId, it)) + record.getCapabilities().len > 0 and #RFC 31 requirement + nodeShard.shardIds.anyIt(record.containsShard(nodeShard.clusterId, it)) #RFC 64 guideline return some(predicate)