From 359cbf4a78c426132fb91afa1dd3e651fa1dc57e Mon Sep 17 00:00:00 2001 From: NagyZoltanPeter <113987313+NagyZoltanPeter@users.noreply.github.com> Date: Thu, 2 Jul 2026 03:43:03 +0200 Subject: [PATCH] WIP logosdeliverynode app initial commit --- Makefile | 13 ++- .../logos_delivery_node.nim | 98 +++++++++++++++++++ apps/logos_delivery_node/nim.cfg | 10 ++ logos_delivery.nimble | 4 + 4 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 apps/logos_delivery_node/logos_delivery_node.nim create mode 100644 apps/logos_delivery_node/nim.cfg diff --git a/Makefile b/Makefile index daa8a8ad7..ad8798138 100644 --- a/Makefile +++ b/Makefile @@ -219,7 +219,7 @@ testcommon: | build-deps build ########## ## Waku ## ########## -.PHONY: testwaku wakunode2 testwakunode2 example2 chat2 chat2bridge liteprotocoltester +.PHONY: testwaku wakunode2 logosdeliverynode testwakunode2 example2 chat2 chat2bridge liteprotocoltester testwaku: | build-deps build rln-deps librln echo -e $(BUILD_MSG) "build/$@" && \ @@ -236,6 +236,17 @@ else $(NIMBLE) wakunode2 endif +# Windows: build with nim directly — `nimble ` re-clones git deps every +# build and they intermittently hang on the MSYS2 runner. Flags mirror logos_delivery.nimble. +logosdeliverynode: | build-deps build deps librln +ifeq ($(detected_OS),Windows) + echo -e $(BUILD_MSG) "build/$@" && \ + nim c --out:build/logos_delivery_node --mm:refc --cpu:amd64 $(NIM_PARAMS) -d:chronicles_log_level=TRACE apps/logos_delivery_node/logos_delivery_node.nim +else + echo -e $(BUILD_MSG) "build/$@" && \ + $(NIMBLE) logosdeliverynode +endif + benchmarks: | build-deps build deps librln echo -e $(BUILD_MSG) "build/$@" && \ $(NIMBLE) benchmarks diff --git a/apps/logos_delivery_node/logos_delivery_node.nim b/apps/logos_delivery_node/logos_delivery_node.nim new file mode 100644 index 000000000..1a7f1e0df --- /dev/null +++ b/apps/logos_delivery_node/logos_delivery_node.nim @@ -0,0 +1,98 @@ +{.push raises: [].} + +import + std/[options, strutils, sequtils, net], + chronicles, + chronos, + metrics, + system/ansi_c, + libp2p/crypto/crypto +import + ../../tools/confutils/cli_args, + logos_delivery/logos_delivery, + logos_delivery/waku/common/logging + +logScope: + topics = "logosdeliverynode main" + +const git_version* {.strdefine.} = "n/a" + +{.pop.} + # @TODO confutils.nim(775, 17) Error: can raise an unlisted exception: ref IOError +when isMainModule: + ## Node setup happens in 6 phases: + ## 1. Set up storage + ## 2. Initialize node + ## 3. Mount and initialize configured protocols + ## 4. Start node and mounted protocols + ## 5. Start monitoring tools and external interfaces + ## 6. Setup graceful shutdown hooks + + const versionString = "version / git commit hash: " & git_version + + var wakuNodeConf = WakuNodeConf.load(version = versionString).valueOr: + error "failure while loading the configuration", error = error + quit(QuitFailure) + + ## Also called within LogosDelivery.new. The call to startRestServerEssentials + ## needs the following line + logging.setupLog(wakuNodeConf.logLevel, wakuNodeConf.logFormat) + + case wakuNodeConf.cmd + of generateRlnKeystore: + error "generateRlnKeystore not supported by logos_delivery_node; use wakunode2" + quit(QuitFailure) + of noCommand: + # `LogosDelivery` derives the per-layer config from `WakuNodeConf` itself + # (it runs `toWakuConf` internally), then builds the full stack bottom-up: + # Waku <- MessagingClient <- ReliableChannelManager + var node = (waitFor LogosDelivery.new(wakuNodeConf)).valueOr: + error "LogosDelivery initialization failed", error = error + quit(QuitFailure) + + (waitFor node.start()).isOkOr: + error "Starting LogosDelivery failed", error = error + quit(QuitFailure) + + info "Setting up shutdown hooks" + proc asyncStopper(node: LogosDelivery) {.async: (raises: [Exception]).} = + (await node.stop()).isOkOr: + error "LogosDelivery shutdown failed", error = error + quit(QuitSuccess) + + # Handle Ctrl-C SIGINT + proc handleCtrlC() {.noconv.} = + when defined(windows): + # workaround for https://github.com/nim-lang/Nim/issues/4057 + setupForeignThreadGc() + notice "Shutting down after receiving SIGINT" + asyncSpawn asyncStopper(node) + + setControlCHook(handleCtrlC) + + # Handle SIGTERM + when defined(posix): + proc handleSigterm(signal: cint) {.noconv.} = + notice "Shutting down after receiving SIGTERM" + asyncSpawn asyncStopper(node) + + c_signal(ansi_c.SIGTERM, handleSigterm) + + # Handle SIGSEGV + when defined(posix): + proc handleSigsegv(signal: cint) {.noconv.} = + # Require --debugger:native + fatal "Shutting down after receiving SIGSEGV" + + # Not available in -d:release mode + writeStackTrace() + + (waitFor node.stop()).isOkOr: + error "LogosDelivery shutdown failed", error = error + quit(QuitFailure) + + c_signal(ansi_c.SIGSEGV, handleSigsegv) + + info "Node setup complete" + + runForever() diff --git a/apps/logos_delivery_node/nim.cfg b/apps/logos_delivery_node/nim.cfg new file mode 100644 index 000000000..a6fab9c9b --- /dev/null +++ b/apps/logos_delivery_node/nim.cfg @@ -0,0 +1,10 @@ +-d:chronicles_line_numbers +-d:discv5_protocol_id="d5waku" +-d:chronicles_runtime_filtering=on +-d:chronicles_sinks="textlines,json" +-d:chronicles_default_output_device=dynamic +# Disabling the following topics from nim-eth and nim-dnsdisc since some types cannot be serialized +-d:chronicles_disabled_topics="eth,dnsdisc.client" +# Results in empty output for some reason +#-d:"chronicles_enabled_topics=GossipSub:TRACE,WakuRelay:TRACE" +path = "../.." diff --git a/logos_delivery.nimble b/logos_delivery.nimble index 8c4d32cb5..71d2ac079 100644 --- a/logos_delivery.nimble +++ b/logos_delivery.nimble @@ -388,6 +388,10 @@ task wakunode2, "Build Waku v2 cli node": let name = "wakunode2" buildBinary name, "apps/wakunode2/", " -d:chronicles_log_level=TRACE " +task logosdeliverynode, "Build Logos Delivery cli node": + let name = "logos_delivery_node" + buildBinary name, "apps/logos_delivery_node/", " -d:chronicles_log_level=TRACE " + task benchmarks, "Some benchmarks": let name = "benchmarks" buildBinary name, "apps/benchmarks/", "-p:../.."