Mixnet deep-dive

Fixed-size Sphinx packets travel client → entry gateway → three mix layers → exit gateway → lightwalletd. Each packet takes an independent random route, so packets reorder at every layer, and loop cover traffic hides the real packets. Toggle the dVPN contrast to see a straight-through WireGuard tunnel with no mixing — faster, but no timing protection.

Regional (40)Continental (120)Intercontinental (300)
Mixnet 5-hop total ≈ 1.6 sPropagation 720 msMixing 150 msACK return 720 msPackets reorder at each layer; cover traffic hides real packets

Delay at each hop

Client
Σ 0 ms
+120 ms
net →
Entry GW
Σ 120 ms
+120 ms
net →
Mix L1
mix +50 ms
Σ 290 ms
+120 ms
net →
Mix L2
mix +50 ms
Σ 460 ms
+120 ms
net →
Mix L3
mix +50 ms
Σ 630 ms
+120 ms
net →
Exit GW
Σ 750 ms
+120 ms
net →
lightwalletd
Σ 870 ms

Each hop adds ~speed-of-light propagation; each of the three mix layers adds an independent random mixing delay (Loopix). Σ is the running total to that hop.

ClientEntry GWLayer 1Layer 2Layer 3Exit GWlightwalletd

Packet framing — Sphinx

A few KB — the ideal mixnet broadcast workload.

2.1 KB chunked into 2 Sphinx packets
packet #1 · 2.0 KB
400
1570
packet #2 · 2.0 KB
400
630
940
Goodput ≈ 51%2 packetson-wire 4.2 KB+ 2 mixACKs (156 B)Every Sphinx packet is a constant 2000 B — identical on the wire (unlinkable)
Sphinx header ~400 BIPR framing ~30 Bpayload chunk (≤1570 B)padding → 2000 B SphinxWebSocket header ~8 B

Sphinx packets ride WebSocket binary frames over TCP/IP; the reliable channel returns a 56 B mixACK per packet (over TCP/IP, not a Sphinx packet). Goodput counts the ACK return route.

Illustrative model — latency figures are pedagogical, not measured. Each real packet takes an independent random route through the mix layers, so output order differs from input order (per-packet unlinkability).