2408 Commits

Author SHA1 Message Date
stubbsta
43dff68f49
Fix ResultDefect on success and stale test stubs in lightpush retry path
Two bugs left by a bad merge:

1. lightpush.nim: isRlnRelatedFailure was computed before firstResult.isOk()
   was checked, accessing firstResult.error unconditionally. When publish
   succeeds, this raises a ResultDefect. Reorder the guard so isOk()/isNone()
   short-circuits before the error fields are touched.

2. test_wakunode_lightpush.nim: the 420-retry stubs used descriptions
   ("simulated stale merkle path", "still stale") that don't contain
   RlnValidatorErrorMsg. The code gates 420 retries on that substring to
   distinguish RLN rejections from unrelated INVALID_MESSAGE responses
   (e.g. oversized messages). Update stubs to emit RlnValidatorErrorMsg so
   the retry path fires as the tests expect.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-07 10:03:48 +02:00
stubbsta
26b8d2fa6e
Fix merge conflict residue: replace RlnResult with Result in proof.nim
RlnResult[T] was removed as a type alias in commit 0a1700e23 (replace RLN
specific Result with generic Result). The merge left one stale reference at
proof.nim:62; replace with the equivalent Result[seq[byte], string].

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-07 09:51:08 +02:00
stubbsta
1767234e9f
resolve conflict 2026-07-07 09:15:17 +02:00
stubbsta
3f5c2697ec
Gate lightpush Merkle refresh on RlnValidatorErrorMsg for 420 responses
420 INVALID_MESSAGE is returned for any validateMessage failure, not just
RLN ones (e.g. oversized messages), so a bare status-code check triggers
an unbounded on-chain fetchMerkleProofElements RPC per rejected message.
Match the legacy-lightpush path: require the error description to contain
RlnValidatorErrorMsg before refreshing; 504 OUT_OF_RLN_PROOF remains
unconditional as it is unambiguously RLN-specific.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-07 09:00:51 +02:00
stubbsta
f02cb1f881
Extend reactive Merkle proof refresh to REST relay and broker paths
With PathCheckMinInterval removed, a non-empty merkleProofCache is trusted
forever unless force=true is passed. Previously only the two lightpush retry
paths ever passed force=true; the REST relay publish handlers (static and
auto-sharding) and the broker proof provider had no rejection feedback loop,
so a sliding root window would permanently reject their messages until restart.

- REST relay handlers: run validateMessage first; if it returns
  RlnValidatorErrorMsg, force-refresh the cached path and retry validation once
  before publishing — mirroring the lightpush reactive pattern.
- Broker provider (rln.nim): decode the generated proof bytes, call
  validateRoot on the embedded Merkle root, and force-refresh + regenerate
  when the root is outside the acceptance window — since the broker has no
  external rejection signal to react to.

Tests added for all three new paths, using the corrupted-cache technique
(all-zero merkleProofCache → garbage root → rejection → retry).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-06 18:00:54 +02:00
Tanya S
0a1700e239
replace RLN specific Result with generic Result (#4011) 2026-07-06 17:49:20 +02:00
Ivan FB
21569ef884
ffi: unify node lifecycle on logosdelivery_* and drop legacy waku_* surface (#4012) 2026-07-06 16:13:48 +02:00
stubbsta
e7afdce63e
Fix nonce rollback race: make rollbackNonce CAS-conditional
Two bugs in the previous blind-decrement rollbackNonce():

1. Concurrent draw: another proof generated between attempt 1 and the retry
   advances nextNonce, so decrementing steals a nonce already claimed by
   another live message — nullifier collision, on-chain slashable.

2. Pre-attached proof: if the incoming message already carries a proof,
   checkAndGenerateRLNProof short-circuits and draws no nonce, yet the retry
   still called rollback, stomping on whatever nonce the preceding message
   legitimately drew.

Fix: rollbackNonce now takes the specific nonce as a parameter and only
decrements when nextNonce == nonce + 1. checkAndGenerateRLNProof returns
(msg, messageId) so callers can thread the drawn id through to the retry
as reuseMessageId; generateRLNProof no longer performs an implicit rollback.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-06 15:01:16 +02:00
stubbsta
6b75c6f921
Merge branch 'master' into chore/refresh-merkleproofcache-on-msg-rejection 2026-07-06 10:31:16 +02:00
Igor Sirotin
7a3a064b52
feat: add status.prod network preset (cluster 16, RLN off) (#3962)
Add a `status.prod` network preset usable from the Messaging API and CLI
(`--preset=status.prod`). It targets the live status.prod network that
Status runs on:

- cluster-id 16
- RLN disabled
- static sharding (fleet shards 1, 32, 64, 128, 256; Status uses 32 & 64)
- max message size 1024KiB
- bootstrap via the status.prod DNS-discovery enrtree and the three fleet boot nodes

Config sourced from https://fleets.waku.org/ and each host's /config.toml.

Closes #3906

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 13:04:57 +01:00
stubbsta
96bf3a3046
Add nonce rollback for lightpush publish retry 2026-07-03 13:30:18 +02:00
NagyZoltanPeter
42ccb5c673
chore: replace ReliableChannel sendhandler hack (#3994)
* squash original commits and rebase to master: removed sendHandler and replaced by MessagingSend BrokerRequest

* Needed to adapt to new messaging source structure to avoid cyclic imports

* Relocate MessagingSend request broker and eliminate api/requests

* fix ci fails
2026-07-02 17:46:05 +02:00
Darshan
ad17541619
fix: handle peer-exchange stream-closed errors gracefully (#4010) 2026-07-02 18:46:46 +05:30
stubbsta
287bafc45c
Fix linting 2026-07-02 14:16:00 +02:00
stubbsta
1473301b09
Add tests for lightpush force refresh regenerates proof 2026-07-02 13:45:49 +02:00
stubbsta
5659ab61ec
refresh merkle proof cache reactively on lightpush rejection 2026-07-02 13:16:32 +02:00
Tanya S
cbb601ec9f
chore: phase 4 — remove RLN proof generation from lightpush server to client (#4009)
* remove RLN proof generation from lightpush server to client

* set timestamp before generating lightpush msg proof

* Add explicit error message for checkAndGenerateRLNProof and oneline for ensureTimestampSet

* Change ensureTimestampSet from func to proc
2026-07-01 14:02:07 +02:00
Darshan
440bd01cd8
fix: handle on-chain RPC errors gracefully during RLN setup (#4008) 2026-07-01 11:48:32 +05:30
Ivan FB
82dcada1b5
api: define layer contracts with concept, not RootObj inheritance (#4001) 2026-06-30 22:15:04 +02:00
Fabiana Cecin
7b6d5d542c
fix: remove hardcoded ports in tests (#3998)
* Remove hardcoded ports in tests
* Promote getPorts to a public helper in net/net_config.nim
* Make 0.0.0.0:0 a default argument for newTestWakuNode
2026-06-30 14:59:27 -03:00
Ivan FB
a45b785141
messaging: depend on the Waku kernel, not the raw WakuNode (#4000) 2026-06-30 18:00:12 +02:00
Fabiana Cecin
a763a59ac9
fix: fix portsShift feature (#4006)
* Fold portsShift into each port in WakuConfBuilder.build()
* Drop portsShift field from WakuConf
* Drop portsShift param from networkConfiguration, discv5 setup, rest/metrics start
* Keep Port(0) auto-assign sentinel (also fixes port-0 + shift)
* Add regression test: announced port == bound port under portsShift

* Fix lint
2026-06-30 11:30:41 -03:00
NagyZoltanPeter
a7f893555d
Integrate api-shape phase2 (#3989) + api interfaces (#3975) (#3999)
* Reshape per-layer API into api/ folders and thin the FFI over them

Each layer now separates its constructible core from its public surface:

  - core module (waku.nim / messaging_client.nim /
    reliable_channel_manager.nim): the type plus new/start/stop and the
    private construction helpers.
  - api/ folder: one module per differentiated set of operations
    (waku: topics/relay/filter/lightpush/store/peer_manager/discovery/
    debug/health) plus an events surface.

The waku api is reshaped to be the complete operation surface the C
bindings need, so the library no longer reaches into node internals:
relayPublish returns the message hash, relaySubscribe takes an optional
handler, filter/lightpush auto-select the service peer, connectedPeersInfo
returns structured data, pingPeer honours the timeout, plus
relayNumPeersInMesh / relayNumConnectedPeers / isOnline. library/ is now a
thin C-ABI shim: each {.ffi.} proc only marshals cstring/JSON/callbacks and
delegates to ctx.myLib[].waku.<op> (or messagingClient.<op>).
app_callbacks re-exports the modules defining its handler types, which the
included FFI files previously relied on by leakage.

Events move next to the surface that owns them, with each dependency kept
pointing the right way:

  - waku/events/ relocated under waku/api/events/.
  - channel events live in channels/api/events.nim.
  - the four messaging-level message events move to messaging/api/events;
    MessageSeenEvent stays in waku because it is emitted by waku core, so
    moving it would make waku depend on the messaging layer.
  - delivery_events renamed to filter_subscribe_events to match the
    OnFilterSubscribe/Unsubscribe events it actually declares.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Add reliable-channel FFI ops + events (nim-ffi v0.1.3)

Expose the reliable-channel layer through the v0.1.3 FFI:
- channel_create / channel_send / channel_close call the
  ReliableChannelManager api (createReliableChannel / send / closeChannel),
  marshalling channel id + base64 payload + ephemeral by hand
- channel message received / sent / errored are surfaced by listening to the
  channel-layer broker events in start_node and forwarding them through
  callEventCallback (received payload base64-encoded), dropped in stop_node

Stays on nim-ffi v0.1.3 (no typed/CBOR rewrite).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Expose reliable-channel ops in the stable C header (#3851)

The library already ships as a single .so with a tiered header surface
(liblogosdelivery.h = stable Messaging/Reliable-Channels, liblogosdelivery_kernel.h
= advanced Kernel). Per that tiering, the reliable-channel ops belong on the
stable surface, so declare channel_create / channel_send / channel_close in
liblogosdelivery.h and document the channel lifecycle events delivered through
the event callback.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Graft PR#3975 interface layer onto decomposed foundation (events deduped)

Add IKernel/IMessagingClient/IReliableChannelManager/ILogosDelivery interface
classes under logos_delivery/api/. The EventBroker types PR#3975 hoisted into
these files already exist in PR#3989's decomposed */api/events/ modules, so the
interface files re-export those modules instead of redefining the types
(avoids 8 duplicate EventBroker definitions). api/types.nim kept at the
foundation version (ChannelId stays in channels/types.nim, which the decomposed
modules import).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Wire impl classes to interfaces (inherit; relocate SendHandler)

- Waku : IKernel, MessagingClient : IMessagingClient,
  ReliableChannelManager : IReliableChannelManager.
- The operation procs already live in PR#3989's decomposed */api/ modules and
  stay as plain procs (nothing dispatches through the interface types, so no
  method-ization is needed).
- SendHandler now lives in reliable_channel_manager_api.nim (its PR#3975 home);
  removed the duplicate from reliable_channel.nim, which re-exports the
  interface module so channels/api/{channel_lifecycle,send} still see it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Wire LogosDelivery to ILogosDelivery orchestrator interface

LogosDelivery : ILogosDelivery; start/stop/isOnline become method overrides.
Peripheral PR#3975 edits (lightpush/store clients, self_req_handlers,
statistics) are import-reorg artifacts of deleting waku/utils/requests.nim,
which the decomposed structure keeps -- so they are intentionally not ported.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Dedup EventConnectionStatusChange (re-export from health_events)

9th duplicate EventBroker type: defined in both logos_delivery_api.nim and the
decomposed waku/api/events/health_events.nim. The interface file now re-exports
it. liblogosdelivery builds clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Move events back into interface-class source files (restore #3975 placement)

Reverses the earlier dedup-by-re-export: event TYPE definitions now live in the
interface classes, and the emptied decomposed event files are removed.

- MessageSeenEvent            -> logos_delivery/api/kernel_api.nim
- Message{Sent,Error,Propagated,Received}Event -> api/messaging_client_api.nim
- ChannelMessage{Received,Sent,Error}Event     -> api/reliable_channel_manager_api.nim
- EventConnectionStatusChange -> api/logos_delivery_api.nim

Deleted (became empty after the move):
- logos_delivery/waku/api/events/message_events.nim
- logos_delivery/messaging/api/events.nim
- logos_delivery/channels/api/events.nim
health_events.nim keeps its two remaining events (content/shard topic health).

Rewiring: each layer re-exports its interface module (waku->kernel_api,
messaging_client->messaging_client_api, reliable_channel->reliable_channel_manager_api,
which also re-exports messaging_client_api). Deep emitters/listeners
(subscription_manager, waku_node, waku_node/relay, node_health_monitor,
recv_service, send_service) import the owning interface module directly.
kernel_api stays below node level (types/topics/message/store-common) so the
node->kernel_api imports are acyclic. liblogosdelivery builds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* nph formatting

---------

Co-authored-by: Ivan FB <ivansete@status.im>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 11:51:22 +02:00
Darshan
a4cd261fc7
fix: start_node() after stop_node() re-opens the listener (#4007) 2026-06-30 11:40:11 +02:00
Tanya S
ec36e09bae
chore: phase 3 — inline RLN validator, allow mountRlnRelay without wakuRelay (#3985)
* Add rln validator to mountRlnRelay

* remove requirement for relay when mounting RLN

* Rename mountRlnRelay to setRlnValidator

* Clean up setRlnValidator: update log wording, drop unused let bindings

* Fix botched setRlnValidator callsites from rename

* Drop obsolete test: setRlnValidator no longer requires relay

* Remove unused code in test utils

* remove unused import for rln
2026-06-29 13:01:04 +02:00
Tanya S
57ff24760f
chore: phase 2 — rename/restructure waku_rln_relay → waku_rln (#3978)
* move rln specific procs and types

* Renaming and restructuring RLN module

* Rename waku_rln_relay to waku_rln

* rename rln-relay types to rln

* Fix linting

* update logScope topics to match new rln module name

* Rename waku_rln module to rln

* Rename WakuRln type to Rln, rename FFI raw type to RlnRaw to avoid collision

* Apply nph formatting

* Rename local rlnRelay to rln in mountRlnRelay
2026-06-27 12:28:59 +02:00
AYAHASSAN287
26098d76cf
Add send API e2e tests to the PR job (#3983)
* Add send API e2e tests to the PR job

* Update yml reference

* ci: pin interop smoke tests to SMOKE_TEST_2026.06.25 tag

* ci: retrigger CI

* ci: retrigger CI
2026-06-26 18:36:06 +02:00
Tanya S
4ba5710a15
chore: phase 1 - extract generateRlnValidator into temp adapter dir (#3984)
* extract generateRlnValidator into temp adapter dir

* fix linting
2026-06-26 14:43:40 +02:00
Darshan
3eebc7288b
test: add S16 lightpush dynamic-recovery unittest (#3995) 2026-06-26 01:23:57 +05:30
Tanya S
fc15430e52
Temporarily extend ci test job timeout (#3997) 2026-06-25 17:13:38 +02:00
NagyZoltanPeter
6d35800fce
Chore: api shape phase2 (#3974)
* Move waku.nim from waku/factory to under waku/
* remove unused
* Realize Kernel API in scope of Waku class
* Refactor waku/api into messaging_client, waku/api/types and api_conf into logos_delivery/api
* Make liblogosdelivery and wakunode2 compile, remove waku/api.nim as it was just a import orchestrator
* make test compile and run
* Reconcile master's new send tests to LogosDelivery API after rebase

master commits #3965/#3669-followup added two test cases (Edge lightpush
delivery #3847, store-validation timeout) written against the removed
waku/api.nim createNode helper. Rewrite them to the LogosDelivery shape:
createNode -> LogosDelivery.new, node.node -> node.waku.node,
node.brokerCtx -> node.waku.brokerCtx, node.send -> node.messagingClient.send,
and drop the now-implicit mountMessagingClient calls (LogosDelivery.new
mounts the client internally).
2026-06-25 09:27:01 +02:00
Fabiana Cecin
56b92cfd71
chore: Fix .md docs (fix broken links, add QUIC notes) (#3988) 2026-06-25 09:11:52 +02:00
Ivan FB
5c20f48ab3
chore: build C/C++ examples on macOS via POSIX getopt (#3982) 2026-06-24 14:44:44 +02:00
Tanya S
b279533214
Apply LogosDelivery Orchestrator changes to api_send tests (#3976) 2026-06-24 10:43:16 +02:00
NagyZoltanPeter
8501d051a1
fix - Cap store checks on propagated messages by MessagingClient (#3965)
* Frame send service store checks and cap to 1 min per task

* Add test for store not verify case
2026-06-23 12:22:16 +02:00
Ivan FB
5309ce294b
fix: retry send tasks stuck in Entry state 2026-06-23 11:39:35 +02:00
Ivan FB
1a3b3204fa
feat: add LogosDelivery orchestrator as project entry point for FFI (#3970) 2026-06-23 01:20:09 +02:00
NagyZoltanPeter
2fe7e1c373
Workaround MacOS build issue caused by between new bearssl 0.2.9 and crhonos 2.2.4 (#3969) 2026-06-22 10:01:54 +02:00
Ivan FB
319c0c68fe
chore: simplify release process — merge deploy into prepare_release (#3964)
Co-authored-by: Igor Sirotin <sirotin@status.im>
2026-06-19 15:29:33 +02:00
Simon-Pierre Vivier
a73035e28d
feat: integrate service discovery (#3947)
---------

Co-authored-by: Fabiana Cecin <fabiana@waku.org>
2026-06-18 12:51:27 -04:00
Fabiana Cecin
03efe6766c
Messaging backfill from store only when regaining connectivity (#3957)
* ConnectionStatus transition to connected now trigger store query
* Query period computed over period in which the node was disconnected
* remove periodic 5min store query
* add connection status edge-triggered test case
* refactor RecvService test suite

Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2026-06-18 13:23:49 -03:00
Tanya S
02ad7783bf
Add tests for merkle root and proof updates (#3950)
* make generateProof async and add ensureFreshMerkleProofPath

* Use Wakumessage.new()

* Add trigger for client side only merkleproofcache updates

* full decoupling of updateRoots and merkleproofcache update

* Add tests for on demand merkle path updates

* debugging WIP

* fix for getTransactionReceipt endless loop

* clean up group manager logs

* Remove unused code from rebase mistake

* Improve Anvil proc for RLN testing

* fixing from rebase

* Fix message ref in tests and clean up logs in utils_onchain

* Clean up more logs

* Change root update log to trace

* Increase approved token amount for RLN registration testing

* Reduce comments in utils_onchain

* simplify benchmarks test result output

* Add test names

* remove duplicated tests for test_rln_groupmanager

* Trim group_manager tests

* Remove long test for local window of roots and improve amvil test performance

* Optimise tests for group_manager
2026-06-18 14:50:04 +02:00
Ivan FB
066838aa03
chore: address deferred SDS-handler review comments from #3942 (#3960) 2026-06-17 20:28:43 +02:00
Fabiana Cecin
c3090fb62f
feat: QUIC transport support (#3951)
* additive quic transport, off by default (--quic-support)
* add QuicConf + QuicConfBuilder, --quic-support / --quic-port flags
* net_config announces quic-v1 host/ext/dns4 addrs, adds quic-v1 to enr multiaddrs
* newWakuSwitch mounts quic transport when a quic addr is set
* toRemotePeerInfo: quic from enr multiaddrs ext, sorted quic-first
* BoundPorts.quic, read back the bound quic port at start (handles --quic-port=0)
* skip auto quic addr when operator supplies one via --ext-multiaddr
* tests: nodes dual-stack by default, tcp-only where single transport asserted
* tests: drop hardcoded ephemeral ports (port 0) to fix quic-churn bind flakes
* use setupNat to discover NAT-mapped UDP port when QUIC enabled
2026-06-17 07:55:45 -03:00
Darshan
7e98489a24
feat: wire ReliabilityManager into the Reliable Channel (#3942) 2026-06-16 10:40:59 +05:30
Fabiana Cecin
6837ae0c1f
feat: bump nim-libp2p to v2.0.0 (#3929)
* bump nim-libp2p pin to v2.0.0 tag
* bump json_rpc to v0.6.1, lsquic to v0.5.1, boringssl to v0.0.8 (latest tags)
* add libp2p_mix dep; repoint libp2p/protocols/mix -> libp2p_mix
* pin nimble.lock: websock / protobuf_serialization / npeg / jwt
* Makefile: add -d:libp2p_quic_support
* regenerate nix/deps.nix (adds libp2p_mix, refreshes pins)
* migrate rng ref HmacDrbgContext -> libp2p Rng across prod/channels/tests (interface-only; same DRBG)
* waku_switch: TransportConfig factory; unified 2.0.0 connection limits (withMaxInOut, withMaxConnections); local MaxConnections
* waku_relay/rendezvous/discv5/kademlia: v2.0.0 API (rng, config, ServiceDiscovery rename)
* call Service.setup() on post-build switch services (2.0.0 split setup/start)
* drop libp2p/utils/semaphore -> chronos AsyncSemaphore
* add logos_delivery/waku/compat/option_valueor shim (Option[T] valueOr/withValue, dropped upstream)
* add std/options where a transitive re-export was removed
* add newStandardSwitch shim (libp2p removed it in 2.0.0); mounts yamux+mplex to match prod muxer
* PeerId.random(rng); common.rng()/crypto.newRng(); hoist shared rng (instantiation cleanup)
* update expectations for 2.0.0 defaults: DEFAULT_PROTOCOLS += /ipfs/id/push/1.0.0; agent "nim-libp2p"
* drop relay reboot/reconnect test (asserted a Switch restart capability that is simply not supported)
* fix up a few tests that were flaking on MacOS (libp2p upgrade may have exposed these)
2026-06-15 09:56:15 -03:00
Ivan FB
54c890856f
feat: unify libs into a single liblogosdelivery (#3949) 2026-06-15 13:03:44 +02:00
Darshan
9289ba6220
chore: update release issue templates to logos fleets (#3952) 2026-06-13 10:48:29 +05:30
Tanya S
22040b739f
feat: decouple merkle path and on-demand strategy (#3940)
* make validateRoots async

* add on-demand refreshRoots functionality

* Move max rootsrefresh time to constants

* make generateProof async and add ensureFreshMerkleProofPath

* Update to match code format and linting

* Use Wakumessage.new()

* Add trigger for client side only merkleproofcache updates

* full decoupling of updateRoots and merkleproofcache update

* Fix isNil check format

* Move moment check to top of roots and merkle path update procs

* Update PathCheckMinInterval

* Add tests for on demand merkle path updates

* Replace appendRLNProof and use message.toRLNSignal

* Fix linting

* Remove commented code

* Remove more old commented code

* Fix formatting and simplifications
2026-06-12 12:22:34 +02:00
Fabiana Cecin
b7c2cee2c9
fix(pr-lint): grant the comment job pull-requests:write (#3944) 2026-06-11 10:31:53 +02:00