From 5ed8c94db0e7040b3b477559e90c7e8b1834a222 Mon Sep 17 00:00:00 2001 From: E M <5089238+emizzle@users.noreply.github.com> Date: Fri, 6 Feb 2026 12:35:55 +1100 Subject: [PATCH] replace findPeer and findProvider For findProvider, return seq[PeerRecord] instead of SignedPeerRecord as PeerRecords are not stored in the Kad DHT. Possibly leaves open the ability to poison the provider records in the DHT --- codex/blockexchange/engine/discovery.nim | 12 ++++++---- codex/discovery.nim | 28 +++++++++++------------- codex/utils/addrutils.nim | 12 ++++++++++ 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/codex/blockexchange/engine/discovery.nim b/codex/blockexchange/engine/discovery.nim index 6a1b808d..9410fa0c 100644 --- a/codex/blockexchange/engine/discovery.nim +++ b/codex/blockexchange/engine/discovery.nim @@ -112,7 +112,7 @@ proc discoveryTaskLoop(b: DiscoveryEngine) {.async: (raises: []).} = continue if haves.len < b.minPeersPerBlock: - let request = b.discovery.find(cid) + let request = b.discovery.find(cid) # seq[PeerRecord] b.inFlightDiscReqs[cid] = request codex_inflight_discovery.set(b.inFlightDiscReqs.len.int64) @@ -121,12 +121,16 @@ proc discoveryTaskLoop(b: DiscoveryEngine) {.async: (raises: []).} = codex_inflight_discovery.set(b.inFlightDiscReqs.len.int64) if (await request.withTimeout(DefaultDiscoveryTimeout)) and - peers =? (await request).catch: - let dialed = await allFinished(peers.mapIt(b.network.dialPeer(it.data))) + providers =? (await request).catch: + let dialed = await allFinished( + providers.mapIt( + b.network.dialPeer(it) + ) + ) for i, f in dialed: if f.failed: - await b.discovery.removeProvider(peers[i].data.peerId) + await b.discovery.removeProvider(providers[i].peerId) except CancelledError: trace "Discovery task cancelled" return diff --git a/codex/discovery.nim b/codex/discovery.nim index ba4b524e..d8c513b3 100644 --- a/codex/discovery.nim +++ b/codex/discovery.nim @@ -62,42 +62,40 @@ proc toNodeId*(host: ca.Address): NodeId = proc findPeer*( d: Discovery, peerId: PeerId ): Future[?PeerRecord] {.async: (raises: [CancelledError]).} = - trace "protocol.resolve..." + trace "protocol.findPeer..." ## Find peer using the given Discovery object ## try: - let node = await d.protocol.resolve(toNodeId(peerId)) + without peerInfo = await d.protocol.findPeer(peerId), error: + debug "Could not find peer", peerId = peerId, error = error.msg + return PeerRecord.none + + return some peerInfo.toPeerRecord - return - if node.isSome(): - node.get().record.data.some - else: - PeerRecord.none except CancelledError as exc: warn "Error finding peer", peerId = peerId, exc = exc.msg raise exc - except CatchableError as exc: - warn "Error finding peer", peerId = peerId, exc = exc.msg - - return PeerRecord.none method find*( d: Discovery, cid: Cid -): Future[seq[SignedPeerRecord]] {.async: (raises: [CancelledError]), base.} = +): Future[seq[PeerRecord]] {.async: (raises: [CancelledError]), base.} = ## Find block providers ## try: - without providers =? (await d.protocol.getProviders(cid.toNodeId())).mapFailure, + without var providers =? (await d.protocol.getProviders(cid.toKey())).mapFailure, error: warn "Error finding providers for block", cid, error = error.msg - return providers.filterIt(not (it.data.peerId == d.peerId)) + providers.excl(d.peerId) + + return providers.mapIt(it.toPeerRecord) + except CancelledError as exc: warn "Error finding providers for block", cid, exc = exc.msg raise exc - except CatchableError as exc: + except LPStreamError, DialFailedError as exc: warn "Error finding providers for block", cid, exc = exc.msg method provide*(d: Discovery, cid: Cid) {.async: (raises: [CancelledError]), base.} = diff --git a/codex/utils/addrutils.nim b/codex/utils/addrutils.nim index 158d85dc..e04e7d5d 100644 --- a/codex/utils/addrutils.nim +++ b/codex/utils/addrutils.nim @@ -102,3 +102,15 @@ proc toBootstrapAddrs*(sprs: openArray[SignedPeerRecord]): seq[(PeerId, seq[Mult res.add spr.toBootstrapAddr return res + +proc toPeerRecord*(peerInfo: PeerInfo): PeerRecord = + ## Convert PeerInfo to PeerRecord + ## + PeerRecord.init(peerInfo.peerId, peerInfo.addrs) + +proc toPeerRecord*(provider: Provider): PeerRecord = + ## Convert Provider to PeerRecord + ## + PeerRecord.init(provider.peerId, provider.addrs) + +{.pop.}