dVPN cover traffic
In dVPN mode many wallet clients spread across several entry gateways all exit through one shared exit gateway to lightwalletd. Each sends a GetBlockHeight(height=…) gRPC call — the height varies per entry gateway — so lightwalletd sees a mix of requests from a single exit IP and cannot map any to a client. The more wallets share the exit, the larger the anonymity set — this is why coordinating on shared exit-gateway sets matters. Below: the WireGuard packet framing (two nested headers + the remaining payload, up to a 1500-byte MTU).
GetBlockHeight(height=…); the height varies per entry gatewaylightwalletd sees every request from one exit IP — can't map it to a clientWhat lightwalletd sees
Requests arrive from a single exit-gateway IP. The height parameter varies per entry gateway, and clients sharing an entry gateway send the same height — so lightwalletd sees a mix of heights it cannot bind to any client. With 10 wallets across 5 gateways the cover set is large. (dVPN hides the IP but not timing; pair with mixnet broadcast for timing safety.)
dVPN packet framing
A few KB — the ideal mixnet broadcast workload.