logos-delivery/tests/node/test_wakunode_legacy_lightpush.nim

345 lines
12 KiB
Nim
Raw Permalink Normal View History

feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
{.used.}
import
refresh merkle proof cache reactively on msg publish rejection (#4013) * refresh merkle proof cache reactively on lightpush rejection * Add tests for lightpush force refresh regenerates proof * Fix linting * Add nonce rollback for lightpush publish retry * 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> * 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> * 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> * 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> * 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> * Fix linting * Dedupe checkAndGenerateRLNProof force-refresh test Same test existed in both test_wakunode_lightpush.nim and test_wakunode_legacy_lightpush.nim. It exercises the checkAndGenerateRLNProof primitive (short-circuit override on force=true + nonce rollback + cache refetch), not lightpush-specific behavior. The modern lightpush copy provides full coverage; the legacy copy paid the anvil/on-chain setup cost for zero incremental coverage. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Bound lightpush RLN refresh-retry with a 5s timeout The reactive refresh + retry path calls into the RLN contract (eth_call for getMerkleProof) then republishes over libp2p — neither has an outer bound, so a hanging RPC endpoint could stall the caller indefinitely. Wrap the retry in withTimeout(RlnRefreshRetryTimeout); on timeout, log and return the original error rather than hang. Applied to both the legacy and modern lightpushPublish retry paths. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Extract broker RLN proof provider into generateRLNProofWithRootRefresh The broker proof provider's inline logic — generate proof, decode it, self-validate the root against the acceptable-root window, and on stale root force-refresh + regenerate — is a reusable primitive on its own. Lift it into rln/proof.nim next to the existing generateRLNProof so the provider closure in mount() collapses to a single call, and any future non-broker caller can share the same flow. Pure refactor; behavior identical. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Extract REST relay handlers' RLN attach+validate+retry into a helper Both the static and auto POST handlers duplicated the same block: attach an RLN proof, run wakuRelay.validateMessage, and on RlnValidatorErrorMsg substring force-refresh the merkle path and revalidate. Lift the block into attachRlnProofValidateWithRetry alongside a small RlnPublishError variant so the handlers can keep dispatching 500 for proof-gen failures and 400 for validator rejections. Each handler is now ~15 lines instead of ~35 and the retry contract lives in one place. Pure refactor; behavior unchanged. Verified against tests/wakunode_rest/test_rest_relay.nim (13/13) including the two stale- RLN-proof retry tests added earlier on this branch. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Simplify legacy lightpush autosharding path to a direct getShard call The single-content-topic path went through getShardsFromContentTopics, iterated the resulting table under the assumption it was 1-entry, and had a defensive fallthrough (`resolved = false` → bare `return`) for the empty-table case. That case is unreachable: on success the table always has exactly one entry, and the fallthrough returned a default- initialized Result — not behavior worth preserving. Replace with the same two-step pattern the modern lightpushPublish uses (NsContentTopic.parse → sharding.getShard) so both handlers share a shape and the (now-explicit) failure paths surface useful error strings. Verified against tests/node/test_wakunode_legacy_lightpush.nim (9/9). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Break up legacyLightpushPublish into single-purpose helpers legacyLightpushPublish had grown to ~100 lines with three concerns interleaved: choosing between client/self-request publish, resolving the effective pubsub topic, and running the RLN refresh-retry with timeout. Lift each into a private top-level proc so the main proc reads top-to- bottom in ~35 lines: precondition → prepare message + proof → resolve topic → publish once → RLN-refresh retry if applicable. The new helpers are: - internalLegacyLightpushPublish — client vs self-request dispatch (was the inline closure) - resolveLegacyPubsubTopic — explicit param or autosharding - runRlnRefreshRetry — force-refresh proof + retry with RlnRefreshRetryTimeout bound; returns caller's fallback on timeout Nonce now appears in a top-level signature, so import it directly from rln/nonce_manager rather than re-exporting through rln/proof.nim (the latter would leak nonce_manager's bulk chronos/times exports and clash with waku_rendezvous overload resolution). Pure refactor; behavior unchanged. Verified against tests/node/test_wakunode_legacy_lightpush.nim (9/9) and tests/node/test_wakunode_lightpush.nim (11/11). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Replace forceMerkleProofRefresh flag with invalidateMerkleProofCache The forceMerkleProofRefresh bool was threaded through five procs (checkAndGenerateRLNProof → generateRLNProof → generateProof base + on-chain → ensureFreshMerkleProofPath) purely so a caller could ask the merkle path to be refetched from chain on a stale-RLN retry. Reading any one of those signatures required a mental stack trace back up to the retry caller to know what "force" meant. Flip the contract: expose invalidateMerkleProofCache on the group manager; callers invoke it on the retry path to empty the cache, and the normal proof-gen flow then sees an empty cache and refetches on its own. No flag crosses procs. Removed forceMerkleProofRefresh from: - group_manager_base.generateProof (+ on_chain override) - ensureFreshMerkleProofPath (its `force` param) - generateRLNProof Renamed on checkAndGenerateRLNProof: forceMerkleProofRefresh → regenerate. It now controls one thing — bypassing the "message already has a proof" short-circuit — and never propagates downstream. Callers pair it with invalidateMerkleProofCache when they need the refetch semantics too. Retry callers updated in lockstep: generateRLNProofWithRootRefresh, REST attachRlnProofValidateWithRetry, and both legacy + modern lightpush retry paths now call groupManager.invalidateMerkleProofCache() before regenerating. The primitive test in test_wakunode_lightpush.nim now exercises the pair directly, and the onchain ensureFreshMerkleProofPath test is rewritten to exercise invalidate → ensureFresh as one flow (retiring its `force = true` variant). Pure refactor; behavior unchanged. Verified against: tests/waku_rln_relay/test_rln_group_manager_onchain.nim (29/29) tests/wakunode_rest/test_rest_relay.nim (13/13) tests/waku_rln_relay/test_wakunode_rln_relay.nim (5/5, 1 skip) tests/node/test_wakunode_lightpush.nim (11/11) tests/node/test_wakunode_legacy_lightpush.nim (9/9) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Reject empty merkle proof cache in on-chain generateProof An empty cache passes the existing mod-32 length check and silently produces a witness with no path elements, yielding a proof no validator will accept. Catch the case explicitly so the failure surfaces at the callsite rather than after a wasted publish round-trip. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Drop nonce reuse on RLN retry; consume a fresh nonce instead The retry path threaded a rejected attempt's message id back so NonceManager.rollbackNonce could CAS the counter and reclaim the slot. This bought at most one nonce per retry (a rare event) at the cost of an Option[Nonce] param, a tuple return, and a concurrent-draw race the CAS had to defend against. Simpler to optimistically waste the nonce: checkAndGenerateRLNProof returns Result[WakuMessage, string] and callers drop the tuple destructuring. NonceManager.rollbackNonce and its tests, now dead, are removed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Split checkAndGenerateRLNProof: extract attachRLNProof The `regenerate: bool` param was control coupling: every caller passing `regenerate = true` was a retry path that had already established `rln.isSome()` (it just called `invalidateMerkleProofCache` on the group manager) and wanted an unconditional fresh proof, not a "check and maybe generate". Extract that into `attachRLNProof(r: Rln, message)`, which always draws a fresh nonce and rebuilds the proof, replacing any existing one. `checkAndGenerateRLNProof(rln: Option[Rln], message)` keeps only its "check" behaviour — short-circuit on an existing proof, pass through when RLN is not configured — and delegates to `attachRLNProof`. Taking a concrete `Rln` deletes the previously unreachable `regenerate = true` + `rln.isNone()` branch (which would have republished the stale rejected proof) at the type level, and removes the duplicated nonce-draw/generateProof/encode body that checkAndGenerateRLNProof carried alongside generateRLNProof. The two lightpush retry sites and the invalidate+regenerate test now call attachRLNProof directly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Bound only the proof refresh on lightpush RLN retry, not the republish RlnRefreshRetryTimeout previously wrapped the whole retry leg: merkle path refetch + proof regeneration + the second publish. Sharing one clock meant a slow (but successful) refetch could leave no budget for the publish, cancelling it mid-flight — burning the freshly drawn nonce and, worse, reporting the original RLN rejection while the retried request may already have reached the service node and been relayed. Move the withTimeout to cover only attachRLNProof (the on-chain eth_call + proof regeneration — the one step with an unbounded external dependency). The retried publish runs unbounded after it, matching the first attempt's semantics, so slow transports (e.g. an optional mix route) cannot be cancelled by the refresh budget and the caller always receives the publish's actual result. On refresh timeout the retry publish never starts and the original rejection is returned, so a "failed" answer now guarantees no second request is in flight. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Shield the shared merkle path refetch from caller cancellation ensureFreshMerkleProofPath coalesces concurrent callers onto a single in-flight refetch future and awaited it directly. Chronos propagates cancellation into the awaited future, so one caller being cancelled (e.g. a publish retry whose RlnRefreshRetryTimeout fired mid-refetch) cancelled the shared future under every coalesced caller — and threw away an eth_call that may have been about to complete. Await the in-flight future via join() instead: cancelling a caller only detaches its callback. The refetch always runs to completion, coalesced callers keep waiting, and even when every caller times out the cache still gets populated in the background so the next publish fast-paths instead of paying the RPC round-trip again. Detaching is safe because doRefresh cannot fail with an unhandled exception: the eth_call wrappers catch CatchableError and return Result, and failures surface to callers through fetchOk / an empty cache exactly as before. Adds a test cancelling the initiating caller mid-refetch and asserting the shared future survives and the coalesced caller completes with a populated cache. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Move message publish retries out of the kernel on stale RLN proof On a stale-merkle-proof rejection the kernel and REST layers no longer republish internally. They schedule a detached merkle proof refresh and fail fast with a distinguishable, retry-worthy error, leaving the retry decision to the caller. - add GroupManager.scheduleMerkleProofRefresh: drops the cached path and asyncSpawns the refetch (join-shielded, so a cancelled caller never cancels the shared refetch); base is a no-op. - v3 lightpush (node.lightpushPublish): on an RLN-related 420/504, call scheduleMerkleProofRefresh and return immediately, normalized to 504 OUT_OF_RLN_PROOF with RlnProofRefreshScheduledMsg. The internal republish and its bounded timeout are gone. - send service: lightpushPublishToAny now routes through node.lightpushPublish so every NextRoundRetry round regenerates the proof against the current cache; the existing OUT_OF_RLN_PROOF -> NextRoundRetry mapping is the retry. - REST lightpush: pass the 504 through unchanged (no internal retry). - REST relay: attachRlnProofValidateWithRetry -> attachRlnProofAndValidate; validate once, on RLN-invalid schedule the refresh and return 503 with the marker instead of regenerating and revalidating in-request. - rename RlnRefreshRetryTimeout -> RlnMerkleProofRefreshTimeout; it now bounds only the legacy lightpush refresh, which keeps its one-shot internal retry (no wire error taxonomy to delegate to callers). Not touched: legacy lightpush retry behavior, the proof.nim attachRLNProof/checkAndGenerateRLNProof split, and the merkle path refetch/coalescing internals of ensureFreshMerkleProofPath. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Tighten RLN proof-refresh docstrings and comments Condense the verbose comments introduced with the reactive merkle proof-refresh work. No code changes. - group_manager_base: base methods carry the contract; the OnchainGroupManager overrides keep only their concrete behavior instead of repeating the rationale. - proof.nim, lightpush.nim, constants.nim: trim multi-line docstrings and inline comments to their load-bearing facts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Make the merkle proof path refresh safe against concurrent invalidation ensureFreshMerkleProofPath returns the fetched path instead of leaving callers to re-read merkleProofCache. generateProof uses the returned value, so an invalidate landing during the refresh's updateMemberCache suspension can no longer empty the cache under an in-flight proof-gen and trip its empty-cache guard. The cache field is now only a hint for the next call. invalidateMerkleProofCache also bumps merkleProofCacheGeneration. The refresh stamps the generation before each fetchMerkleProofElements and only caches a result whose generation is unchanged, otherwise it fetches again, bounded by MerkleProofRefetchMaxAttempts. A rejection-driven invalidate is therefore never absorbed by a fetch that predates it, so the path a caller receives always postdates the invalidate. refreshRoots awaits rootsRefreshInFlightFut via join() at both await sites, giving the roots refresh the same cancellation shield the proof path refetch already had: a cancelled validateRoot caller no longer cancels the refresh its coalesced peers are waiting on. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-14 11:27:37 +02:00
std/[options, tempfiles, net, osproc, strutils],
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
testutils/unittests,
chronos,
std/strformat,
libp2p/crypto/crypto
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
import
logos_delivery/waku/[
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
waku_core,
node/peer_manager,
waku_node,
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
waku_lightpush_legacy,
waku_lightpush_legacy/common,
waku_lightpush_legacy/protocol_metrics,
rln,
refresh merkle proof cache reactively on msg publish rejection (#4013) * refresh merkle proof cache reactively on lightpush rejection * Add tests for lightpush force refresh regenerates proof * Fix linting * Add nonce rollback for lightpush publish retry * 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> * 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> * 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> * 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> * 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> * Fix linting * Dedupe checkAndGenerateRLNProof force-refresh test Same test existed in both test_wakunode_lightpush.nim and test_wakunode_legacy_lightpush.nim. It exercises the checkAndGenerateRLNProof primitive (short-circuit override on force=true + nonce rollback + cache refetch), not lightpush-specific behavior. The modern lightpush copy provides full coverage; the legacy copy paid the anvil/on-chain setup cost for zero incremental coverage. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Bound lightpush RLN refresh-retry with a 5s timeout The reactive refresh + retry path calls into the RLN contract (eth_call for getMerkleProof) then republishes over libp2p — neither has an outer bound, so a hanging RPC endpoint could stall the caller indefinitely. Wrap the retry in withTimeout(RlnRefreshRetryTimeout); on timeout, log and return the original error rather than hang. Applied to both the legacy and modern lightpushPublish retry paths. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Extract broker RLN proof provider into generateRLNProofWithRootRefresh The broker proof provider's inline logic — generate proof, decode it, self-validate the root against the acceptable-root window, and on stale root force-refresh + regenerate — is a reusable primitive on its own. Lift it into rln/proof.nim next to the existing generateRLNProof so the provider closure in mount() collapses to a single call, and any future non-broker caller can share the same flow. Pure refactor; behavior identical. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Extract REST relay handlers' RLN attach+validate+retry into a helper Both the static and auto POST handlers duplicated the same block: attach an RLN proof, run wakuRelay.validateMessage, and on RlnValidatorErrorMsg substring force-refresh the merkle path and revalidate. Lift the block into attachRlnProofValidateWithRetry alongside a small RlnPublishError variant so the handlers can keep dispatching 500 for proof-gen failures and 400 for validator rejections. Each handler is now ~15 lines instead of ~35 and the retry contract lives in one place. Pure refactor; behavior unchanged. Verified against tests/wakunode_rest/test_rest_relay.nim (13/13) including the two stale- RLN-proof retry tests added earlier on this branch. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Simplify legacy lightpush autosharding path to a direct getShard call The single-content-topic path went through getShardsFromContentTopics, iterated the resulting table under the assumption it was 1-entry, and had a defensive fallthrough (`resolved = false` → bare `return`) for the empty-table case. That case is unreachable: on success the table always has exactly one entry, and the fallthrough returned a default- initialized Result — not behavior worth preserving. Replace with the same two-step pattern the modern lightpushPublish uses (NsContentTopic.parse → sharding.getShard) so both handlers share a shape and the (now-explicit) failure paths surface useful error strings. Verified against tests/node/test_wakunode_legacy_lightpush.nim (9/9). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Break up legacyLightpushPublish into single-purpose helpers legacyLightpushPublish had grown to ~100 lines with three concerns interleaved: choosing between client/self-request publish, resolving the effective pubsub topic, and running the RLN refresh-retry with timeout. Lift each into a private top-level proc so the main proc reads top-to- bottom in ~35 lines: precondition → prepare message + proof → resolve topic → publish once → RLN-refresh retry if applicable. The new helpers are: - internalLegacyLightpushPublish — client vs self-request dispatch (was the inline closure) - resolveLegacyPubsubTopic — explicit param or autosharding - runRlnRefreshRetry — force-refresh proof + retry with RlnRefreshRetryTimeout bound; returns caller's fallback on timeout Nonce now appears in a top-level signature, so import it directly from rln/nonce_manager rather than re-exporting through rln/proof.nim (the latter would leak nonce_manager's bulk chronos/times exports and clash with waku_rendezvous overload resolution). Pure refactor; behavior unchanged. Verified against tests/node/test_wakunode_legacy_lightpush.nim (9/9) and tests/node/test_wakunode_lightpush.nim (11/11). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Replace forceMerkleProofRefresh flag with invalidateMerkleProofCache The forceMerkleProofRefresh bool was threaded through five procs (checkAndGenerateRLNProof → generateRLNProof → generateProof base + on-chain → ensureFreshMerkleProofPath) purely so a caller could ask the merkle path to be refetched from chain on a stale-RLN retry. Reading any one of those signatures required a mental stack trace back up to the retry caller to know what "force" meant. Flip the contract: expose invalidateMerkleProofCache on the group manager; callers invoke it on the retry path to empty the cache, and the normal proof-gen flow then sees an empty cache and refetches on its own. No flag crosses procs. Removed forceMerkleProofRefresh from: - group_manager_base.generateProof (+ on_chain override) - ensureFreshMerkleProofPath (its `force` param) - generateRLNProof Renamed on checkAndGenerateRLNProof: forceMerkleProofRefresh → regenerate. It now controls one thing — bypassing the "message already has a proof" short-circuit — and never propagates downstream. Callers pair it with invalidateMerkleProofCache when they need the refetch semantics too. Retry callers updated in lockstep: generateRLNProofWithRootRefresh, REST attachRlnProofValidateWithRetry, and both legacy + modern lightpush retry paths now call groupManager.invalidateMerkleProofCache() before regenerating. The primitive test in test_wakunode_lightpush.nim now exercises the pair directly, and the onchain ensureFreshMerkleProofPath test is rewritten to exercise invalidate → ensureFresh as one flow (retiring its `force = true` variant). Pure refactor; behavior unchanged. Verified against: tests/waku_rln_relay/test_rln_group_manager_onchain.nim (29/29) tests/wakunode_rest/test_rest_relay.nim (13/13) tests/waku_rln_relay/test_wakunode_rln_relay.nim (5/5, 1 skip) tests/node/test_wakunode_lightpush.nim (11/11) tests/node/test_wakunode_legacy_lightpush.nim (9/9) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Reject empty merkle proof cache in on-chain generateProof An empty cache passes the existing mod-32 length check and silently produces a witness with no path elements, yielding a proof no validator will accept. Catch the case explicitly so the failure surfaces at the callsite rather than after a wasted publish round-trip. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Drop nonce reuse on RLN retry; consume a fresh nonce instead The retry path threaded a rejected attempt's message id back so NonceManager.rollbackNonce could CAS the counter and reclaim the slot. This bought at most one nonce per retry (a rare event) at the cost of an Option[Nonce] param, a tuple return, and a concurrent-draw race the CAS had to defend against. Simpler to optimistically waste the nonce: checkAndGenerateRLNProof returns Result[WakuMessage, string] and callers drop the tuple destructuring. NonceManager.rollbackNonce and its tests, now dead, are removed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Split checkAndGenerateRLNProof: extract attachRLNProof The `regenerate: bool` param was control coupling: every caller passing `regenerate = true` was a retry path that had already established `rln.isSome()` (it just called `invalidateMerkleProofCache` on the group manager) and wanted an unconditional fresh proof, not a "check and maybe generate". Extract that into `attachRLNProof(r: Rln, message)`, which always draws a fresh nonce and rebuilds the proof, replacing any existing one. `checkAndGenerateRLNProof(rln: Option[Rln], message)` keeps only its "check" behaviour — short-circuit on an existing proof, pass through when RLN is not configured — and delegates to `attachRLNProof`. Taking a concrete `Rln` deletes the previously unreachable `regenerate = true` + `rln.isNone()` branch (which would have republished the stale rejected proof) at the type level, and removes the duplicated nonce-draw/generateProof/encode body that checkAndGenerateRLNProof carried alongside generateRLNProof. The two lightpush retry sites and the invalidate+regenerate test now call attachRLNProof directly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Bound only the proof refresh on lightpush RLN retry, not the republish RlnRefreshRetryTimeout previously wrapped the whole retry leg: merkle path refetch + proof regeneration + the second publish. Sharing one clock meant a slow (but successful) refetch could leave no budget for the publish, cancelling it mid-flight — burning the freshly drawn nonce and, worse, reporting the original RLN rejection while the retried request may already have reached the service node and been relayed. Move the withTimeout to cover only attachRLNProof (the on-chain eth_call + proof regeneration — the one step with an unbounded external dependency). The retried publish runs unbounded after it, matching the first attempt's semantics, so slow transports (e.g. an optional mix route) cannot be cancelled by the refresh budget and the caller always receives the publish's actual result. On refresh timeout the retry publish never starts and the original rejection is returned, so a "failed" answer now guarantees no second request is in flight. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Shield the shared merkle path refetch from caller cancellation ensureFreshMerkleProofPath coalesces concurrent callers onto a single in-flight refetch future and awaited it directly. Chronos propagates cancellation into the awaited future, so one caller being cancelled (e.g. a publish retry whose RlnRefreshRetryTimeout fired mid-refetch) cancelled the shared future under every coalesced caller — and threw away an eth_call that may have been about to complete. Await the in-flight future via join() instead: cancelling a caller only detaches its callback. The refetch always runs to completion, coalesced callers keep waiting, and even when every caller times out the cache still gets populated in the background so the next publish fast-paths instead of paying the RPC round-trip again. Detaching is safe because doRefresh cannot fail with an unhandled exception: the eth_call wrappers catch CatchableError and return Result, and failures surface to callers through fetchOk / an empty cache exactly as before. Adds a test cancelling the initiating caller mid-refetch and asserting the shared future survives and the coalesced caller completes with a populated cache. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Move message publish retries out of the kernel on stale RLN proof On a stale-merkle-proof rejection the kernel and REST layers no longer republish internally. They schedule a detached merkle proof refresh and fail fast with a distinguishable, retry-worthy error, leaving the retry decision to the caller. - add GroupManager.scheduleMerkleProofRefresh: drops the cached path and asyncSpawns the refetch (join-shielded, so a cancelled caller never cancels the shared refetch); base is a no-op. - v3 lightpush (node.lightpushPublish): on an RLN-related 420/504, call scheduleMerkleProofRefresh and return immediately, normalized to 504 OUT_OF_RLN_PROOF with RlnProofRefreshScheduledMsg. The internal republish and its bounded timeout are gone. - send service: lightpushPublishToAny now routes through node.lightpushPublish so every NextRoundRetry round regenerates the proof against the current cache; the existing OUT_OF_RLN_PROOF -> NextRoundRetry mapping is the retry. - REST lightpush: pass the 504 through unchanged (no internal retry). - REST relay: attachRlnProofValidateWithRetry -> attachRlnProofAndValidate; validate once, on RLN-invalid schedule the refresh and return 503 with the marker instead of regenerating and revalidating in-request. - rename RlnRefreshRetryTimeout -> RlnMerkleProofRefreshTimeout; it now bounds only the legacy lightpush refresh, which keeps its one-shot internal retry (no wire error taxonomy to delegate to callers). Not touched: legacy lightpush retry behavior, the proof.nim attachRLNProof/checkAndGenerateRLNProof split, and the merkle path refetch/coalescing internals of ensureFreshMerkleProofPath. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Tighten RLN proof-refresh docstrings and comments Condense the verbose comments introduced with the reactive merkle proof-refresh work. No code changes. - group_manager_base: base methods carry the contract; the OnchainGroupManager overrides keep only their concrete behavior instead of repeating the rationale. - proof.nim, lightpush.nim, constants.nim: trim multi-line docstrings and inline comments to their load-bearing facts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Make the merkle proof path refresh safe against concurrent invalidation ensureFreshMerkleProofPath returns the fetched path instead of leaving callers to re-read merkleProofCache. generateProof uses the returned value, so an invalidate landing during the refresh's updateMemberCache suspension can no longer empty the cache under an in-flight proof-gen and trip its empty-cache guard. The cache field is now only a hint for the next call. invalidateMerkleProofCache also bumps merkleProofCacheGeneration. The refresh stamps the generation before each fetchMerkleProofElements and only caches a result whose generation is unchanged, otherwise it fetches again, bounded by MerkleProofRefetchMaxAttempts. A rejection-driven invalidate is therefore never absorbed by a fetch that predates it, so the path a caller receives always postdates the invalidate. refreshRoots awaits rootsRefreshInFlightFut via join() at both await sites, giving the roots refresh the same cancellation shield the proof path refetch already had: a cancelled validateRoot caller no longer cancels the refresh its coalesced peers are waiting on. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-14 11:27:37 +02:00
rln/constants,
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
],
../testlib/[wakucore, wakunode, testasync, futures, testutils],
../resources/payloads,
../waku_rln_relay/[rln/waku_rln_relay_utils, utils_onchain]
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
suite "Waku Legacy Lightpush - End To End":
var
server {.threadvar.}: WakuNode
client {.threadvar.}: WakuNode
serverRemotePeerInfo {.threadvar.}: RemotePeerInfo
pubsubTopic {.threadvar.}: PubsubTopic
contentTopic {.threadvar.}: ContentTopic
message {.threadvar.}: WakuMessage
asyncSetup:
let
serverKey = generateSecp256k1Key()
clientKey = generateSecp256k1Key()
server = newTestWakuNode(serverKey)
client = newTestWakuNode(clientKey)
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
await allFutures(server.start(), client.start())
await server.start()
(await server.mountRelay()).isOkOr:
assert false, "Failed to mount relay"
check (await server.mountLegacyLightpush()).isOk() # without rln-relay
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
client.mountLegacyLightpushClient()
serverRemotePeerInfo = server.peerInfo.toRemotePeerInfo()
pubsubTopic = DefaultPubsubTopic
contentTopic = DefaultContentTopic
message = fakeWakuMessage()
asyncTeardown:
await server.stop()
suite "Assessment of Message Relaying Mechanisms":
asyncTest "Via 11/WAKU2-RELAY from Relay/Full Node":
# Given a light lightpush client
let lightpushClient = newTestWakuNode(generateSecp256k1Key())
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
lightpushClient.mountLegacyLightpushClient()
# When the client publishes a message
let publishResponse = await lightpushClient.legacyLightpushPublish(
some(pubsubTopic), message, serverRemotePeerInfo
)
if not publishResponse.isOk():
echo "Publish failed: ", publishResponse.error()
# Then the message is not relayed but not due to RLN
assert publishResponse.isErr(), "We expect an error response"
assert (publishResponse.error == protocol_metrics.notPublishedAnyPeer),
"incorrect error response"
suite "Waku LightPush Validation Tests":
asyncTest "Validate message size exceeds limit":
let msgOverLimit = fakeWakuMessage(
contentTopic = contentTopic,
payload = getByteSequence(DefaultMaxWakuMessageSize + 64 * 1024),
)
# When the client publishes an over-limit message
let publishResponse = await client.legacyLightpushPublish(
some(pubsubTopic), msgOverLimit, serverRemotePeerInfo
)
check:
publishResponse.isErr()
publishResponse.error ==
fmt"Message size exceeded maximum of {DefaultMaxWakuMessageSize} bytes"
suite "RLN Proofs as a Lightpush Service":
var
server {.threadvar.}: WakuNode
client {.threadvar.}: WakuNode
anvilProc {.threadvar.}: Process
manager {.threadvar.}: OnchainGroupManager
wakuRlnConfig {.threadvar.}: WakuRlnConfig
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
serverRemotePeerInfo {.threadvar.}: RemotePeerInfo
pubsubTopic {.threadvar.}: PubsubTopic
contentTopic {.threadvar.}: ContentTopic
message {.threadvar.}: WakuMessage
asyncSetup:
let
serverKey = generateSecp256k1Key()
clientKey = generateSecp256k1Key()
server = newTestWakuNode(serverKey)
client = newTestWakuNode(clientKey)
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
anvilProc = runAnvil(stateFile = some(DEFAULT_ANVIL_STATE_PATH))
manager = waitFor setupOnchainGroupManager(deployContracts = false)
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
# mount rln-relay
2026-06-15 09:56:15 -03:00
# match prod epoch window to reduce test flake
wakuRlnConfig = getWakuRlnConfig(
refresh merkle proof cache reactively on msg publish rejection (#4013) * refresh merkle proof cache reactively on lightpush rejection * Add tests for lightpush force refresh regenerates proof * Fix linting * Add nonce rollback for lightpush publish retry * 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> * 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> * 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> * 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> * 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> * Fix linting * Dedupe checkAndGenerateRLNProof force-refresh test Same test existed in both test_wakunode_lightpush.nim and test_wakunode_legacy_lightpush.nim. It exercises the checkAndGenerateRLNProof primitive (short-circuit override on force=true + nonce rollback + cache refetch), not lightpush-specific behavior. The modern lightpush copy provides full coverage; the legacy copy paid the anvil/on-chain setup cost for zero incremental coverage. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Bound lightpush RLN refresh-retry with a 5s timeout The reactive refresh + retry path calls into the RLN contract (eth_call for getMerkleProof) then republishes over libp2p — neither has an outer bound, so a hanging RPC endpoint could stall the caller indefinitely. Wrap the retry in withTimeout(RlnRefreshRetryTimeout); on timeout, log and return the original error rather than hang. Applied to both the legacy and modern lightpushPublish retry paths. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Extract broker RLN proof provider into generateRLNProofWithRootRefresh The broker proof provider's inline logic — generate proof, decode it, self-validate the root against the acceptable-root window, and on stale root force-refresh + regenerate — is a reusable primitive on its own. Lift it into rln/proof.nim next to the existing generateRLNProof so the provider closure in mount() collapses to a single call, and any future non-broker caller can share the same flow. Pure refactor; behavior identical. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Extract REST relay handlers' RLN attach+validate+retry into a helper Both the static and auto POST handlers duplicated the same block: attach an RLN proof, run wakuRelay.validateMessage, and on RlnValidatorErrorMsg substring force-refresh the merkle path and revalidate. Lift the block into attachRlnProofValidateWithRetry alongside a small RlnPublishError variant so the handlers can keep dispatching 500 for proof-gen failures and 400 for validator rejections. Each handler is now ~15 lines instead of ~35 and the retry contract lives in one place. Pure refactor; behavior unchanged. Verified against tests/wakunode_rest/test_rest_relay.nim (13/13) including the two stale- RLN-proof retry tests added earlier on this branch. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Simplify legacy lightpush autosharding path to a direct getShard call The single-content-topic path went through getShardsFromContentTopics, iterated the resulting table under the assumption it was 1-entry, and had a defensive fallthrough (`resolved = false` → bare `return`) for the empty-table case. That case is unreachable: on success the table always has exactly one entry, and the fallthrough returned a default- initialized Result — not behavior worth preserving. Replace with the same two-step pattern the modern lightpushPublish uses (NsContentTopic.parse → sharding.getShard) so both handlers share a shape and the (now-explicit) failure paths surface useful error strings. Verified against tests/node/test_wakunode_legacy_lightpush.nim (9/9). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Break up legacyLightpushPublish into single-purpose helpers legacyLightpushPublish had grown to ~100 lines with three concerns interleaved: choosing between client/self-request publish, resolving the effective pubsub topic, and running the RLN refresh-retry with timeout. Lift each into a private top-level proc so the main proc reads top-to- bottom in ~35 lines: precondition → prepare message + proof → resolve topic → publish once → RLN-refresh retry if applicable. The new helpers are: - internalLegacyLightpushPublish — client vs self-request dispatch (was the inline closure) - resolveLegacyPubsubTopic — explicit param or autosharding - runRlnRefreshRetry — force-refresh proof + retry with RlnRefreshRetryTimeout bound; returns caller's fallback on timeout Nonce now appears in a top-level signature, so import it directly from rln/nonce_manager rather than re-exporting through rln/proof.nim (the latter would leak nonce_manager's bulk chronos/times exports and clash with waku_rendezvous overload resolution). Pure refactor; behavior unchanged. Verified against tests/node/test_wakunode_legacy_lightpush.nim (9/9) and tests/node/test_wakunode_lightpush.nim (11/11). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Replace forceMerkleProofRefresh flag with invalidateMerkleProofCache The forceMerkleProofRefresh bool was threaded through five procs (checkAndGenerateRLNProof → generateRLNProof → generateProof base + on-chain → ensureFreshMerkleProofPath) purely so a caller could ask the merkle path to be refetched from chain on a stale-RLN retry. Reading any one of those signatures required a mental stack trace back up to the retry caller to know what "force" meant. Flip the contract: expose invalidateMerkleProofCache on the group manager; callers invoke it on the retry path to empty the cache, and the normal proof-gen flow then sees an empty cache and refetches on its own. No flag crosses procs. Removed forceMerkleProofRefresh from: - group_manager_base.generateProof (+ on_chain override) - ensureFreshMerkleProofPath (its `force` param) - generateRLNProof Renamed on checkAndGenerateRLNProof: forceMerkleProofRefresh → regenerate. It now controls one thing — bypassing the "message already has a proof" short-circuit — and never propagates downstream. Callers pair it with invalidateMerkleProofCache when they need the refetch semantics too. Retry callers updated in lockstep: generateRLNProofWithRootRefresh, REST attachRlnProofValidateWithRetry, and both legacy + modern lightpush retry paths now call groupManager.invalidateMerkleProofCache() before regenerating. The primitive test in test_wakunode_lightpush.nim now exercises the pair directly, and the onchain ensureFreshMerkleProofPath test is rewritten to exercise invalidate → ensureFresh as one flow (retiring its `force = true` variant). Pure refactor; behavior unchanged. Verified against: tests/waku_rln_relay/test_rln_group_manager_onchain.nim (29/29) tests/wakunode_rest/test_rest_relay.nim (13/13) tests/waku_rln_relay/test_wakunode_rln_relay.nim (5/5, 1 skip) tests/node/test_wakunode_lightpush.nim (11/11) tests/node/test_wakunode_legacy_lightpush.nim (9/9) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Reject empty merkle proof cache in on-chain generateProof An empty cache passes the existing mod-32 length check and silently produces a witness with no path elements, yielding a proof no validator will accept. Catch the case explicitly so the failure surfaces at the callsite rather than after a wasted publish round-trip. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Drop nonce reuse on RLN retry; consume a fresh nonce instead The retry path threaded a rejected attempt's message id back so NonceManager.rollbackNonce could CAS the counter and reclaim the slot. This bought at most one nonce per retry (a rare event) at the cost of an Option[Nonce] param, a tuple return, and a concurrent-draw race the CAS had to defend against. Simpler to optimistically waste the nonce: checkAndGenerateRLNProof returns Result[WakuMessage, string] and callers drop the tuple destructuring. NonceManager.rollbackNonce and its tests, now dead, are removed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Split checkAndGenerateRLNProof: extract attachRLNProof The `regenerate: bool` param was control coupling: every caller passing `regenerate = true` was a retry path that had already established `rln.isSome()` (it just called `invalidateMerkleProofCache` on the group manager) and wanted an unconditional fresh proof, not a "check and maybe generate". Extract that into `attachRLNProof(r: Rln, message)`, which always draws a fresh nonce and rebuilds the proof, replacing any existing one. `checkAndGenerateRLNProof(rln: Option[Rln], message)` keeps only its "check" behaviour — short-circuit on an existing proof, pass through when RLN is not configured — and delegates to `attachRLNProof`. Taking a concrete `Rln` deletes the previously unreachable `regenerate = true` + `rln.isNone()` branch (which would have republished the stale rejected proof) at the type level, and removes the duplicated nonce-draw/generateProof/encode body that checkAndGenerateRLNProof carried alongside generateRLNProof. The two lightpush retry sites and the invalidate+regenerate test now call attachRLNProof directly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Bound only the proof refresh on lightpush RLN retry, not the republish RlnRefreshRetryTimeout previously wrapped the whole retry leg: merkle path refetch + proof regeneration + the second publish. Sharing one clock meant a slow (but successful) refetch could leave no budget for the publish, cancelling it mid-flight — burning the freshly drawn nonce and, worse, reporting the original RLN rejection while the retried request may already have reached the service node and been relayed. Move the withTimeout to cover only attachRLNProof (the on-chain eth_call + proof regeneration — the one step with an unbounded external dependency). The retried publish runs unbounded after it, matching the first attempt's semantics, so slow transports (e.g. an optional mix route) cannot be cancelled by the refresh budget and the caller always receives the publish's actual result. On refresh timeout the retry publish never starts and the original rejection is returned, so a "failed" answer now guarantees no second request is in flight. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Shield the shared merkle path refetch from caller cancellation ensureFreshMerkleProofPath coalesces concurrent callers onto a single in-flight refetch future and awaited it directly. Chronos propagates cancellation into the awaited future, so one caller being cancelled (e.g. a publish retry whose RlnRefreshRetryTimeout fired mid-refetch) cancelled the shared future under every coalesced caller — and threw away an eth_call that may have been about to complete. Await the in-flight future via join() instead: cancelling a caller only detaches its callback. The refetch always runs to completion, coalesced callers keep waiting, and even when every caller times out the cache still gets populated in the background so the next publish fast-paths instead of paying the RPC round-trip again. Detaching is safe because doRefresh cannot fail with an unhandled exception: the eth_call wrappers catch CatchableError and return Result, and failures surface to callers through fetchOk / an empty cache exactly as before. Adds a test cancelling the initiating caller mid-refetch and asserting the shared future survives and the coalesced caller completes with a populated cache. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Move message publish retries out of the kernel on stale RLN proof On a stale-merkle-proof rejection the kernel and REST layers no longer republish internally. They schedule a detached merkle proof refresh and fail fast with a distinguishable, retry-worthy error, leaving the retry decision to the caller. - add GroupManager.scheduleMerkleProofRefresh: drops the cached path and asyncSpawns the refetch (join-shielded, so a cancelled caller never cancels the shared refetch); base is a no-op. - v3 lightpush (node.lightpushPublish): on an RLN-related 420/504, call scheduleMerkleProofRefresh and return immediately, normalized to 504 OUT_OF_RLN_PROOF with RlnProofRefreshScheduledMsg. The internal republish and its bounded timeout are gone. - send service: lightpushPublishToAny now routes through node.lightpushPublish so every NextRoundRetry round regenerates the proof against the current cache; the existing OUT_OF_RLN_PROOF -> NextRoundRetry mapping is the retry. - REST lightpush: pass the 504 through unchanged (no internal retry). - REST relay: attachRlnProofValidateWithRetry -> attachRlnProofAndValidate; validate once, on RLN-invalid schedule the refresh and return 503 with the marker instead of regenerating and revalidating in-request. - rename RlnRefreshRetryTimeout -> RlnMerkleProofRefreshTimeout; it now bounds only the legacy lightpush refresh, which keeps its one-shot internal retry (no wire error taxonomy to delegate to callers). Not touched: legacy lightpush retry behavior, the proof.nim attachRLNProof/checkAndGenerateRLNProof split, and the merkle path refetch/coalescing internals of ensureFreshMerkleProofPath. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Tighten RLN proof-refresh docstrings and comments Condense the verbose comments introduced with the reactive merkle proof-refresh work. No code changes. - group_manager_base: base methods carry the contract; the OnchainGroupManager overrides keep only their concrete behavior instead of repeating the rationale. - proof.nim, lightpush.nim, constants.nim: trim multi-line docstrings and inline comments to their load-bearing facts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Make the merkle proof path refresh safe against concurrent invalidation ensureFreshMerkleProofPath returns the fetched path instead of leaving callers to re-read merkleProofCache. generateProof uses the returned value, so an invalidate landing during the refresh's updateMemberCache suspension can no longer empty the cache under an in-flight proof-gen and trip its empty-cache guard. The cache field is now only a hint for the next call. invalidateMerkleProofCache also bumps merkleProofCacheGeneration. The refresh stamps the generation before each fetchMerkleProofElements and only caches a result whose generation is unchanged, otherwise it fetches again, bounded by MerkleProofRefetchMaxAttempts. A rejection-driven invalidate is therefore never absorbed by a fetch that predates it, so the path a caller receives always postdates the invalidate. refreshRoots awaits rootsRefreshInFlightFut via join() at both await sites, giving the roots refresh the same cancellation shield the proof path refetch already had: a cancelled validateRoot caller no longer cancels the refresh its coalesced peers are waiting on. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-14 11:27:37 +02:00
manager = manager,
userMessageLimit = 20,
index = MembershipIndex(1),
epochSizeSec = 600,
2026-06-15 09:56:15 -03:00
)
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
await allFutures(server.start(), client.start())
await server.start()
(await server.mountRelay()).isOkOr:
assert false, "Failed to mount relay"
await server.setRlnValidator(wakuRlnConfig)
check (await server.mountLegacyLightPush()).isOk()
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
client.mountLegacyLightPushClient()
let manager1 = cast[OnchainGroupManager](server.rln.groupManager)
let idCredentials1 = generateCredentials()
(waitFor manager1.register(idCredentials1, UserMessageLimit(20))).isOkOr:
assert false, "error returned when calling register: " & error
let rootUpdated1 = waitFor manager1.updateRoots()
info "Updated root for node1", rootUpdated1
if rootUpdated1:
let proofResult = waitFor manager1.fetchMerkleProofElements()
if proofResult.isErr():
error "Failed to fetch Merkle proof", error = proofResult.error
manager1.merkleProofCache = proofResult.get()
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
serverRemotePeerInfo = server.peerInfo.toRemotePeerInfo()
pubsubTopic = DefaultPubsubTopic
contentTopic = DefaultContentTopic
message = fakeWakuMessage()
asyncTeardown:
await server.stop()
stopAnvil(anvilProc)
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
suite "Lightpush attaching RLN proofs":
asyncTest "Message is published when RLN enabled":
# Given a light lightpush client
let lightpushClient = newTestWakuNode(generateSecp256k1Key())
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
lightpushClient.mountLegacyLightPushClient()
# Attach the RLN proof. In production the client mounts RLN and generates the
# proof in legacyLightpushPublish; here we generate it using the server's RLN
# instance since both ends share group state via the in-memory manager.
let msgWithProof =
(await checkAndGenerateRLNProof(some(server.rln), message)).get()
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
# When the client publishes a message
let publishResponse = await lightpushClient.legacyLightpushPublish(
some(pubsubTopic), msgWithProof, serverRemotePeerInfo
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
)
if not publishResponse.isOk():
echo "Publish failed: ", publishResponse.error()
# Then the message is not relayed but not due to RLN
assert publishResponse.isErr(), "We expect an error response"
check publishResponse.error == protocol_metrics.notPublishedAnyPeer
refresh merkle proof cache reactively on msg publish rejection (#4013) * refresh merkle proof cache reactively on lightpush rejection * Add tests for lightpush force refresh regenerates proof * Fix linting * Add nonce rollback for lightpush publish retry * 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> * 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> * 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> * 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> * 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> * Fix linting * Dedupe checkAndGenerateRLNProof force-refresh test Same test existed in both test_wakunode_lightpush.nim and test_wakunode_legacy_lightpush.nim. It exercises the checkAndGenerateRLNProof primitive (short-circuit override on force=true + nonce rollback + cache refetch), not lightpush-specific behavior. The modern lightpush copy provides full coverage; the legacy copy paid the anvil/on-chain setup cost for zero incremental coverage. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Bound lightpush RLN refresh-retry with a 5s timeout The reactive refresh + retry path calls into the RLN contract (eth_call for getMerkleProof) then republishes over libp2p — neither has an outer bound, so a hanging RPC endpoint could stall the caller indefinitely. Wrap the retry in withTimeout(RlnRefreshRetryTimeout); on timeout, log and return the original error rather than hang. Applied to both the legacy and modern lightpushPublish retry paths. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Extract broker RLN proof provider into generateRLNProofWithRootRefresh The broker proof provider's inline logic — generate proof, decode it, self-validate the root against the acceptable-root window, and on stale root force-refresh + regenerate — is a reusable primitive on its own. Lift it into rln/proof.nim next to the existing generateRLNProof so the provider closure in mount() collapses to a single call, and any future non-broker caller can share the same flow. Pure refactor; behavior identical. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Extract REST relay handlers' RLN attach+validate+retry into a helper Both the static and auto POST handlers duplicated the same block: attach an RLN proof, run wakuRelay.validateMessage, and on RlnValidatorErrorMsg substring force-refresh the merkle path and revalidate. Lift the block into attachRlnProofValidateWithRetry alongside a small RlnPublishError variant so the handlers can keep dispatching 500 for proof-gen failures and 400 for validator rejections. Each handler is now ~15 lines instead of ~35 and the retry contract lives in one place. Pure refactor; behavior unchanged. Verified against tests/wakunode_rest/test_rest_relay.nim (13/13) including the two stale- RLN-proof retry tests added earlier on this branch. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Simplify legacy lightpush autosharding path to a direct getShard call The single-content-topic path went through getShardsFromContentTopics, iterated the resulting table under the assumption it was 1-entry, and had a defensive fallthrough (`resolved = false` → bare `return`) for the empty-table case. That case is unreachable: on success the table always has exactly one entry, and the fallthrough returned a default- initialized Result — not behavior worth preserving. Replace with the same two-step pattern the modern lightpushPublish uses (NsContentTopic.parse → sharding.getShard) so both handlers share a shape and the (now-explicit) failure paths surface useful error strings. Verified against tests/node/test_wakunode_legacy_lightpush.nim (9/9). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Break up legacyLightpushPublish into single-purpose helpers legacyLightpushPublish had grown to ~100 lines with three concerns interleaved: choosing between client/self-request publish, resolving the effective pubsub topic, and running the RLN refresh-retry with timeout. Lift each into a private top-level proc so the main proc reads top-to- bottom in ~35 lines: precondition → prepare message + proof → resolve topic → publish once → RLN-refresh retry if applicable. The new helpers are: - internalLegacyLightpushPublish — client vs self-request dispatch (was the inline closure) - resolveLegacyPubsubTopic — explicit param or autosharding - runRlnRefreshRetry — force-refresh proof + retry with RlnRefreshRetryTimeout bound; returns caller's fallback on timeout Nonce now appears in a top-level signature, so import it directly from rln/nonce_manager rather than re-exporting through rln/proof.nim (the latter would leak nonce_manager's bulk chronos/times exports and clash with waku_rendezvous overload resolution). Pure refactor; behavior unchanged. Verified against tests/node/test_wakunode_legacy_lightpush.nim (9/9) and tests/node/test_wakunode_lightpush.nim (11/11). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Replace forceMerkleProofRefresh flag with invalidateMerkleProofCache The forceMerkleProofRefresh bool was threaded through five procs (checkAndGenerateRLNProof → generateRLNProof → generateProof base + on-chain → ensureFreshMerkleProofPath) purely so a caller could ask the merkle path to be refetched from chain on a stale-RLN retry. Reading any one of those signatures required a mental stack trace back up to the retry caller to know what "force" meant. Flip the contract: expose invalidateMerkleProofCache on the group manager; callers invoke it on the retry path to empty the cache, and the normal proof-gen flow then sees an empty cache and refetches on its own. No flag crosses procs. Removed forceMerkleProofRefresh from: - group_manager_base.generateProof (+ on_chain override) - ensureFreshMerkleProofPath (its `force` param) - generateRLNProof Renamed on checkAndGenerateRLNProof: forceMerkleProofRefresh → regenerate. It now controls one thing — bypassing the "message already has a proof" short-circuit — and never propagates downstream. Callers pair it with invalidateMerkleProofCache when they need the refetch semantics too. Retry callers updated in lockstep: generateRLNProofWithRootRefresh, REST attachRlnProofValidateWithRetry, and both legacy + modern lightpush retry paths now call groupManager.invalidateMerkleProofCache() before regenerating. The primitive test in test_wakunode_lightpush.nim now exercises the pair directly, and the onchain ensureFreshMerkleProofPath test is rewritten to exercise invalidate → ensureFresh as one flow (retiring its `force = true` variant). Pure refactor; behavior unchanged. Verified against: tests/waku_rln_relay/test_rln_group_manager_onchain.nim (29/29) tests/wakunode_rest/test_rest_relay.nim (13/13) tests/waku_rln_relay/test_wakunode_rln_relay.nim (5/5, 1 skip) tests/node/test_wakunode_lightpush.nim (11/11) tests/node/test_wakunode_legacy_lightpush.nim (9/9) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Reject empty merkle proof cache in on-chain generateProof An empty cache passes the existing mod-32 length check and silently produces a witness with no path elements, yielding a proof no validator will accept. Catch the case explicitly so the failure surfaces at the callsite rather than after a wasted publish round-trip. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Drop nonce reuse on RLN retry; consume a fresh nonce instead The retry path threaded a rejected attempt's message id back so NonceManager.rollbackNonce could CAS the counter and reclaim the slot. This bought at most one nonce per retry (a rare event) at the cost of an Option[Nonce] param, a tuple return, and a concurrent-draw race the CAS had to defend against. Simpler to optimistically waste the nonce: checkAndGenerateRLNProof returns Result[WakuMessage, string] and callers drop the tuple destructuring. NonceManager.rollbackNonce and its tests, now dead, are removed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Split checkAndGenerateRLNProof: extract attachRLNProof The `regenerate: bool` param was control coupling: every caller passing `regenerate = true` was a retry path that had already established `rln.isSome()` (it just called `invalidateMerkleProofCache` on the group manager) and wanted an unconditional fresh proof, not a "check and maybe generate". Extract that into `attachRLNProof(r: Rln, message)`, which always draws a fresh nonce and rebuilds the proof, replacing any existing one. `checkAndGenerateRLNProof(rln: Option[Rln], message)` keeps only its "check" behaviour — short-circuit on an existing proof, pass through when RLN is not configured — and delegates to `attachRLNProof`. Taking a concrete `Rln` deletes the previously unreachable `regenerate = true` + `rln.isNone()` branch (which would have republished the stale rejected proof) at the type level, and removes the duplicated nonce-draw/generateProof/encode body that checkAndGenerateRLNProof carried alongside generateRLNProof. The two lightpush retry sites and the invalidate+regenerate test now call attachRLNProof directly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Bound only the proof refresh on lightpush RLN retry, not the republish RlnRefreshRetryTimeout previously wrapped the whole retry leg: merkle path refetch + proof regeneration + the second publish. Sharing one clock meant a slow (but successful) refetch could leave no budget for the publish, cancelling it mid-flight — burning the freshly drawn nonce and, worse, reporting the original RLN rejection while the retried request may already have reached the service node and been relayed. Move the withTimeout to cover only attachRLNProof (the on-chain eth_call + proof regeneration — the one step with an unbounded external dependency). The retried publish runs unbounded after it, matching the first attempt's semantics, so slow transports (e.g. an optional mix route) cannot be cancelled by the refresh budget and the caller always receives the publish's actual result. On refresh timeout the retry publish never starts and the original rejection is returned, so a "failed" answer now guarantees no second request is in flight. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Shield the shared merkle path refetch from caller cancellation ensureFreshMerkleProofPath coalesces concurrent callers onto a single in-flight refetch future and awaited it directly. Chronos propagates cancellation into the awaited future, so one caller being cancelled (e.g. a publish retry whose RlnRefreshRetryTimeout fired mid-refetch) cancelled the shared future under every coalesced caller — and threw away an eth_call that may have been about to complete. Await the in-flight future via join() instead: cancelling a caller only detaches its callback. The refetch always runs to completion, coalesced callers keep waiting, and even when every caller times out the cache still gets populated in the background so the next publish fast-paths instead of paying the RPC round-trip again. Detaching is safe because doRefresh cannot fail with an unhandled exception: the eth_call wrappers catch CatchableError and return Result, and failures surface to callers through fetchOk / an empty cache exactly as before. Adds a test cancelling the initiating caller mid-refetch and asserting the shared future survives and the coalesced caller completes with a populated cache. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Move message publish retries out of the kernel on stale RLN proof On a stale-merkle-proof rejection the kernel and REST layers no longer republish internally. They schedule a detached merkle proof refresh and fail fast with a distinguishable, retry-worthy error, leaving the retry decision to the caller. - add GroupManager.scheduleMerkleProofRefresh: drops the cached path and asyncSpawns the refetch (join-shielded, so a cancelled caller never cancels the shared refetch); base is a no-op. - v3 lightpush (node.lightpushPublish): on an RLN-related 420/504, call scheduleMerkleProofRefresh and return immediately, normalized to 504 OUT_OF_RLN_PROOF with RlnProofRefreshScheduledMsg. The internal republish and its bounded timeout are gone. - send service: lightpushPublishToAny now routes through node.lightpushPublish so every NextRoundRetry round regenerates the proof against the current cache; the existing OUT_OF_RLN_PROOF -> NextRoundRetry mapping is the retry. - REST lightpush: pass the 504 through unchanged (no internal retry). - REST relay: attachRlnProofValidateWithRetry -> attachRlnProofAndValidate; validate once, on RLN-invalid schedule the refresh and return 503 with the marker instead of regenerating and revalidating in-request. - rename RlnRefreshRetryTimeout -> RlnMerkleProofRefreshTimeout; it now bounds only the legacy lightpush refresh, which keeps its one-shot internal retry (no wire error taxonomy to delegate to callers). Not touched: legacy lightpush retry behavior, the proof.nim attachRLNProof/checkAndGenerateRLNProof split, and the merkle path refetch/coalescing internals of ensureFreshMerkleProofPath. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Tighten RLN proof-refresh docstrings and comments Condense the verbose comments introduced with the reactive merkle proof-refresh work. No code changes. - group_manager_base: base methods carry the contract; the OnchainGroupManager overrides keep only their concrete behavior instead of repeating the rationale. - proof.nim, lightpush.nim, constants.nim: trim multi-line docstrings and inline comments to their load-bearing facts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Make the merkle proof path refresh safe against concurrent invalidation ensureFreshMerkleProofPath returns the fetched path instead of leaving callers to re-read merkleProofCache. generateProof uses the returned value, so an invalidate landing during the refresh's updateMemberCache suspension can no longer empty the cache under an in-flight proof-gen and trip its empty-cache guard. The cache field is now only a hint for the next call. invalidateMerkleProofCache also bumps merkleProofCacheGeneration. The refresh stamps the generation before each fetchMerkleProofElements and only caches a result whose generation is unchanged, otherwise it fetches again, bounded by MerkleProofRefetchMaxAttempts. A rejection-driven invalidate is therefore never absorbed by a fetch that predates it, so the path a caller receives always postdates the invalidate. refreshRoots awaits rootsRefreshInFlightFut via join() at both await sites, giving the roots refresh the same cancellation shield the proof path refetch already had: a cancelled validateRoot caller no longer cancels the refresh its coalesced peers are waiting on. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-14 11:27:37 +02:00
# The tests below drive `server.legacyLightpushPublish(...)` against the
# server node. Because `server.wakuLegacyLightPush` is mounted (and no
# legacy client is), the call takes the self-request path — it still runs
# the full client-side flow (proof gen, retry on RlnValidatorErrorMsg
# substring, one-retry cap), but the request lands in the local
# pushHandler. Swapping in a stub pushHandler lets each test control what
# attempt N sees.
asyncTest "retry fires on RlnValidatorErrorMsg substring and second attempt succeeds":
var callCount = 0
let stub: PushMessageHandler = proc(
pubsubTopic: PubsubTopic, message: WakuMessage
): Future[WakuLightPushResult[void]] {.async.} =
inc callCount
if callCount == 1:
return err(RlnValidatorErrorMsg & ": simulated stale merkle path")
return ok()
server.wakuLegacyLightPush.pushHandler = stub
let response = await server.legacyLightpushPublish(
some(pubsubTopic), message, server.peerInfo.toRemotePeerInfo()
)
check:
callCount == 2
response.isOk()
asyncTest "no retry when error does not contain RlnValidatorErrorMsg":
var callCount = 0
let stub: PushMessageHandler = proc(
pubsubTopic: PubsubTopic, message: WakuMessage
): Future[WakuLightPushResult[void]] {.async.} =
inc callCount
return err("unrelated failure")
server.wakuLegacyLightPush.pushHandler = stub
let response = await server.legacyLightpushPublish(
some(pubsubTopic), message, server.peerInfo.toRemotePeerInfo()
)
check:
callCount == 1
response.isErr()
response.error == "unrelated failure"
asyncTest "retry cap: two consecutive RLN errors surface the second":
var callCount = 0
let stub: PushMessageHandler = proc(
pubsubTopic: PubsubTopic, message: WakuMessage
): Future[WakuLightPushResult[void]] {.async.} =
inc callCount
return err(RlnValidatorErrorMsg & ": still stale")
server.wakuLegacyLightPush.pushHandler = stub
let response = await server.legacyLightpushPublish(
some(pubsubTopic), message, server.peerInfo.toRemotePeerInfo()
)
check:
callCount == 2
response.isErr()
response.error.contains(RlnValidatorErrorMsg)
asyncTest "no retry when node.rln is nil":
# Detach RLN so the retry branch short-circuits on rln.isNone() even
# when the error string carries RlnValidatorErrorMsg. Restore before
# teardown so server.stop() sees the same object graph it was
# constructed with.
let savedRln = server.rln
server.rln = nil
var callCount = 0
let stub: PushMessageHandler = proc(
pubsubTopic: PubsubTopic, message: WakuMessage
): Future[WakuLightPushResult[void]] {.async.} =
inc callCount
return err(RlnValidatorErrorMsg & ": simulated")
server.wakuLegacyLightPush.pushHandler = stub
let response = await server.legacyLightpushPublish(
some(pubsubTopic), message, server.peerInfo.toRemotePeerInfo()
)
server.rln = savedRln
check:
callCount == 1
response.isErr()
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
suite "Waku Legacy Lightpush message delivery":
asyncTest "Legacy lightpush message flow succeed":
## Setup
let
lightNodeKey = generateSecp256k1Key()
lightNode = newTestWakuNode(lightNodeKey)
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
bridgeNodeKey = generateSecp256k1Key()
bridgeNode = newTestWakuNode(bridgeNodeKey)
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
destNodeKey = generateSecp256k1Key()
destNode = newTestWakuNode(destNodeKey)
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
await allFutures(destNode.start(), bridgeNode.start(), lightNode.start())
(await destNode.mountRelay()).isOkOr:
assert false, "Failed to mount relay"
(await bridgeNode.mountRelay()).isOkOr:
assert false, "Failed to mount relay"
check (await bridgeNode.mountLegacyLightPush()).isOk()
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
lightNode.mountLegacyLightPushClient()
discard await lightNode.peerManager.dialPeer(
bridgeNode.peerInfo.toRemotePeerInfo(), WakuLegacyLightPushCodec
)
await sleepAsync(100.milliseconds)
await destNode.connectToNodes(@[bridgeNode.peerInfo.toRemotePeerInfo()])
## Given
const CustomPubsubTopic = "/waku/2/rs/0/1"
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
let message = fakeWakuMessage()
var completionFutRelay = newFuture[bool]()
proc relayHandler(
topic: PubsubTopic, msg: WakuMessage
): Future[void] {.async, gcsafe.} =
check:
topic == CustomPubsubTopic
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
msg == message
completionFutRelay.complete(true)
destNode.subscribe((kind: PubsubSub, topic: CustomPubsubTopic), relayHandler).isOkOr:
assert false, "Failed to subscribe to topic:" & $error
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
# Wait for subscription to take effect
await sleepAsync(100.millis)
## When
let res = await lightNode.legacyLightpushPublish(some(CustomPubsubTopic), message)
feat: lightpush v3 (#3279) * Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
2025-03-05 12:07:56 +01:00
assert res.isOk(), $res.error
## Then
check await completionFutRelay.withTimeout(5.seconds)
## Cleanup
await allFutures(lightNode.stop(), bridgeNode.stop(), destNode.stop())
suite "Waku Legacy Lightpush mounting behavior":
asyncTest "fails to mount when relay is not mounted":
## Given a node without Relay mounted
let
key = generateSecp256k1Key()
node = newTestWakuNode(key)
# Do not mount Relay on purpose
check node.wakuRelay.isNil()
## Then mounting Legacy Lightpush must fail
let res = await node.mountLegacyLightPush()
check:
res.isErr()
res.error == MountWithoutRelayError