Wallet Sync
A light wallet does not hold the chain. It syncs against a server, lightwalletd,
which streams the compact blocks and relays the wallet's transactions. That server
is the party the wallet must talk to directly, so it is the primary adversary.
What must not leak
Migration amounts are public on the chain. The privacy the wallet owes its user is the link between an identity and a balance. If the server can attribute a transaction, or a group of them, to one user, it recovers that link.
The threat model
The primary adversary is L2, the server. The dominant vector is V1 identity paired with V3 content. A broadcast from the user's home IP attributes a transaction directly, and grouped transactions sum to a starting balance.
The wallet also faces an application-specific public observer.
| L1 | Chain-only observer |
|---|---|
| Vantage | Knows only what is publicly visible on the chain. |
| Sees | Public on-chain data, including public migration amounts. |
| Cannot see | Anything off-chain. |
The invariants the wallet must hold:
| Invariant | Statement | Depends on |
|---|---|---|
| A. Identity to balance | No user identifier links to a balance, even approximately. | P1 at every actor plus V2 and V3 discipline. |
| B. Transaction grouping | The server must not group one wallet's transactions. | P2 plus V3 content discipline. |
Unprotected: identity and contents arrive together
The wallet talks to lightwalletd directly. The server sees the client IP, every
request and every broadcast. Both invariants fail with no adversarial effort.
Protected: the mixnet hides the client IP
Fixed-size Sphinx packets take three mix layers with per-hop delays, Poisson
sending and cover traffic. The exit gateway forwards to a stock lightwalletd.
The mixnet heavily hides the client IP and its timing from the network. Against the server, a fixed exit still behaves like a single dVPN exit, so requests stay linkable. Rotate the exit per request to restore P2.
The mixnet buys strong identity protection against the server and the network. It does not, on its own, deliver transaction unlinkability at the destination. That needs exit rotation plus the content discipline of the hygiene layer.
Where to go next
- Choose a Defence picks a configuration for your case.
- Build it maps the configuration you picked to a package, for Rust and for the browser.
- The two-layer model explains why transport alone is never the whole answer.
- Packet Anatomy shows what a Sphinx packet exposes and hides.