mirror of
https://github.com/logos-messaging/logos-delivery.git
synced 2026-08-01 09:23:12 +00:00
Squash of 13 commits from feat/mix-dos-protection-libp2p-v2.0.0 onto the logos_delivery/ folder-restructure base from #3935 (build-messaging-folder). Original commit history (squashed): - d8e6dcef feat(mix): integrate mix protocol with extended kademlia + RLN spam protection - fb72f18d refactor(mix): split DoS-protection self-registration into background retry - d8bbef0c feat(mix): bump libp2p stack to v2.0.0 + adopt stateless RLN spam protection - 2f24448a fix(tests): use HmacDrbgContext.new() instead of crypto.newRng() - 5a21455c fix(ci): regen nimble.lock for v2.0.0 + disambiguate rng in wakucore - 03ef02a2 fix(tests): wrap HmacDrbgContext via newBearSslRng for libp2p v2.0.0 - 167ab1df fix(nix): regenerate deps.nix from updated nimble.lock - 97a27222 fix(tests): wrap or pass Rng correctly for 3-arg PrivateKey.random - 5561fcb5 fix(tests): replace removed newStandardSwitch with SwitchBuilder - ba39ee4a fix(tests): libp2p v2.0.0 API migrations across test suite - 328e11df fix: gitignore test binaries + remove accidentally-committed binary - cc712444 fix(tests): more v2.0.0 API migrations (rng template, PeerId.random, etc.) - 412d97a9 fix(tests): unblock CI — nph, excise orphan waku_noise, complete v2.0.0 Rng migration Conflict resolutions (#3935 → ours): - 11 import-path migrations: waku/X → logos_delivery/waku/X - waku_node/waku_node/relay.nim: dropped our `registerRelayHandler` proc (relocated to subscription_manager.nim by #3935; see cascade fix below) - factory/builder.nim: combined both sides' new imports (net_config + waku_switch) - factory/conf_builder/mix_conf_builder.nim: libp2p_mix package (not libp2p/protocols/mix) - waku_mix/protocol.nim: combined paths + our mix_rln_spam_protection/relay/nimchronos imports - 3 test files: dropped noise_utils import (replicates noise excision from original PR) - 2 UA file moves: option_shims.nim and waku_mix_coordination.nim added at new paths Cascade fixes (#3935 lost our work, restored): - subscription_manager.nim: added `mixHandler` to #3935's `registerRelayHandler`, and added `waku_mix` to its imports. Without this, mix messages were silently dropped from the relay handler chain. - config.nims: option_shims auto-import path migrated to logos_delivery/... Validation: - nph check on all 82 staged .nim files: clean (0 reformats needed) - wakunode2 build: exit 0, 38 MB binary - (sim PASS confirmed in earlier identical-state run: 5/5 mix init, 5 RLN proofs gen/verify, 0 errors) Backup tag at original tip: backup/3931-pre-3935-rebase (412d97a9).
91 lines
2.6 KiB
Nim
91 lines
2.6 KiB
Nim
{.push raises: [].}
|
|
|
|
import
|
|
std/[options],
|
|
chronos,
|
|
chronicles,
|
|
metrics,
|
|
results,
|
|
libp2p/protocols/ping,
|
|
libp2p/builders,
|
|
libp2p/transports/tcptransport,
|
|
libp2p/utility
|
|
|
|
import ../waku_node, ../peer_manager
|
|
import libp2p/crypto/rng as libp2p_rng
|
|
|
|
logScope:
|
|
topics = "waku node ping api"
|
|
|
|
proc mountLibp2pPing*(node: WakuNode) {.async: (raises: []).} =
|
|
info "mounting libp2p ping protocol"
|
|
|
|
try:
|
|
# libp2p 1.15.3: Ping.new now expects libp2p's `Rng` (ref object
|
|
# wrapping a ref HmacDrbgContext). Wrap the node's BearSSL rng.
|
|
node.libp2pPing = Ping.new(rng = libp2p_rng.newBearSslRng(node.rng))
|
|
except Exception as e:
|
|
error "failed to create ping", error = getCurrentExceptionMsg()
|
|
|
|
if node.started:
|
|
# Node has started already. Let's start ping too.
|
|
try:
|
|
await node.libp2pPing.start()
|
|
except CatchableError:
|
|
error "failed to start libp2pPing", error = getCurrentExceptionMsg()
|
|
|
|
try:
|
|
node.switch.mount(node.libp2pPing)
|
|
except LPError:
|
|
error "failed to mount libp2pPing", error = getCurrentExceptionMsg()
|
|
|
|
proc pingPeer(node: WakuNode, peerId: PeerId): Future[Result[void, string]] {.async.} =
|
|
## Ping a single peer and return the result
|
|
|
|
try:
|
|
# Establish a stream
|
|
let stream = (await node.peerManager.dialPeer(peerId, PingCodec)).valueOr:
|
|
error "pingPeer: failed dialing peer", peerId = peerId
|
|
return err("pingPeer failed dialing peer peerId: " & $peerId)
|
|
defer:
|
|
# Always close the stream
|
|
try:
|
|
await stream.close()
|
|
except CatchableError as e:
|
|
info "Error closing ping connection", peerId = peerId, error = e.msg
|
|
|
|
# Perform ping
|
|
let pingDuration = await node.libp2pPing.ping(stream)
|
|
|
|
trace "Ping successful", peerId = peerId, duration = pingDuration
|
|
return ok()
|
|
except CatchableError as e:
|
|
error "pingPeer: exception raised pinging peer", peerId = peerId, error = e.msg
|
|
return err("pingPeer: exception raised pinging peer: " & e.msg)
|
|
|
|
# Returns the number of succesful pings performed
|
|
proc parallelPings*(node: WakuNode, peerIds: seq[PeerId]): Future[int] {.async.} =
|
|
if len(peerIds) == 0:
|
|
return 0
|
|
|
|
var pingFuts: seq[Future[Result[void, string]]]
|
|
|
|
# Create ping futures for each peer
|
|
for i, peerId in peerIds:
|
|
let fut = pingPeer(node, peerId)
|
|
pingFuts.add(fut)
|
|
|
|
# Wait for all pings to complete
|
|
discard await allFutures(pingFuts).withTimeout(5.seconds)
|
|
|
|
var successCount = 0
|
|
for fut in pingFuts:
|
|
if not fut.completed() or fut.failed():
|
|
continue
|
|
|
|
let res = fut.read()
|
|
if res.isOk():
|
|
successCount.inc()
|
|
|
|
return successCount
|