★ Recommended

Recommended Architecture for Native App Wallets

The most practical target is the hybrid, deployable now: bulk sync over the dVPN, ideally with exit rotation; broadcasts, t-address queries and other small sensitive requests over the mixnet with an IPR session per request, or to an SP-integrated lightwalletd where available; taking into account the scheduling discussed in Section 5. This is the configuration we recommend implementing for the migration.

dVPN (WireGuard)Mixnet (5-hop)
Mix L1+50 msMix L2+50 msMix L3+50 msClientEntry GWMixnet exit AMixnet exit BMixnet exit CExit GW (dVPN)lightwalletd

Block sync (dVPN) uses a single exit gateway; tx broadcasts (mixnet) fan out across several exit gateways — an IPR session per request — all reaching one lightwalletd. Mixnet responses flow back to the client through the mixnet.

ClientEntry GWMixExit GWlightwalletd
dVPN (WireGuard) (no mixing)Mixnet (5-hop) (mixing delays)

Bulk block sync over fast dVPN; tiny, timing-sensitive tx broadcast over the mixnet — from one wallet process. See the full hybrid scenario for the per-actor assessment.

Operator checklist

1Broadcast transactions over the mixnetLayer 1 · transport

An IPR session per request, or to an SP-integrated lightwalletd where available. This is what protects broadcast timing against network observers (L3L/L3G) and gives per-request unlinkability at the destination.

2Sync blocks over dVPN modeLayer 1 · transport

Bulk, bandwidth-bound sync over the fast dVPN, ideally with exit rotation per request. Hides the client IP from the destination.

3Delay broadcasting transactions in the wallet — do not rely on the mixnetV2 · timing vs L2

Decorrelate broadcast times from sync milestones and never broadcast on reaching the tip. This is a V2 (timing) countermeasure against the destination (L2): the mixnet shapes packet timing in transit, but the destination still sees the broadcast's wall-clock arrival time, so only the wallet can fix it.

4Quantize sync ranges to the network-wide gridV3 · content vs L2

Round each requested range's start down, and its end up, to grid multiples, so every wallet resuming in the same cell emits an identical request. This is a V3 (content / start-height) countermeasure against the destination (L2); it costs only re-downloaded cover blocks.

5Acquire NYM for Nym bandwidth credentialsPrerequisite · both modes

Access to the Nym network — in both dVPN and mixnet mode — requires NYM for bandwidth credentials. Acquire NYM ahead of time, e.g. swap ZEC for NYM with Nym’s swap API (https://swap.nym.com/).

Items 1–2 are Layer 1 transport choices; items 3–4 are Layer 2 baseline hygiene the wallet owes regardless of transport; item 5 is the prerequisite for both.

Baseline hygiene

1Start-height quantizationV3 · vs L2

Since the linking key is the requested range (V3, content), above all its start height, the fix is to make ranges collide: quantize every requested range to a network-wide grid, so that every client resuming anywhere in the same grid cell emits exactly the same request.

  • Grid snapping: round the range start down, and its end up, to multiples of a standard grid spacing (absolute heights). The spacing scales with the range length on the ladder S_j = 144·2^j, never below one day of blocks (1152), so the collision window grows from one block interval to at least a day.
  • Deterministic emission: the quantized range goes on the wire as ascending, disjoint grid cells, with no random sizes, no overlap, no shuffling. Every wallet in the cell says exactly the same thing; per-wallet variation inside a collision set is a distinguishing dimension, not protection.

The cost is re-downloaded cover blocks only: for catch-ups above a day, typically 1.5x to 2x the blocks actually needed, never more than 3x; below a day the cost is bounded in absolute terms, at most one grid cell (~0.5 MB of compact blocks).

2Broadcast hygiene and schedulingV2 · vs L2

Broadcast timing is a V2 (timing) leak at the destination. In-transit mixing does not remove it (the destination still observes wall-clock arrival time), so the wallet must decorrelate broadcasts itself.

  • Never send a broadcast over the sync transport or session.
  • Decorrelate broadcast times from sync milestones; in particular, do not broadcast immediately upon reaching the tip.
  • Use a randomized timer for broadcasts.
  • Destination splitting: sync from one lightwalletd and broadcast through another.
  • Build the transaction when the timer fires, with expiry derived from a tip fetched at that moment: a transaction's expiry height is visible on-chain to everyone (V3), and an expiry derived from a stale tip reveals the wallet's last sync height.
3ParametersV3 + V2 · vs L2

The parameters are part of the protocol, not per-wallet tuning: the mechanism works by every wallet emitting the identical rule.

  • Defaults: the grid parameters (ladder S_j = 144·2^j, one-day floor of 1152 blocks) nest with ZIP 318's 144-block anchor grid, and the broadcast delays (exponential, mean 144 blocks, capped at 576 blocks) are ZIP 318's transfer-scheduling parameters, so wallet broadcasts pool with migration traffic. A wallet that customises its grid floor, split rule, or delay distribution becomes recognisably different from the rest of the crowd.
  • Anonymity sets: anonymity by collision is only as strong as the crowd that collides. The size of the collision sets grows with the number of wallets emitting the identical rule.

Full detail on the Baseline hygiene page.

Recommendation from §6 of the network privacy analysis. Only native wallets get the full hybrid — see Web Wallet vs Native Wallets.