Network privacy for Zcash light wallets

Zcash hides the money. We hide the person.

Your light-wallet server sees your IP, and when your wallet syncs then sends seconds later, it knows the payment is yours. Ghost Layer is a local gateway that breaks that link, with no changes to your wallet.

View on GitHubSee the evidence$ cargo install ghost-layer
100%payments linked without it
0%with Ghost Layer
0%over Nym, even by IP
15+real testnet payments, all mined

Capabilities

Private by default.

Zcash already shields sender, receiver, amount and memo. Ghost Layer protects everything around the payment that the server can still observe.

01

Split broadcast

Every payment leaves on a brand-new connection, never the one your wallet synced on.

0 / 5 linked by connection
02

Random delay

Each payment waits a random 10–40 s (minutes in privacy mode). Restart-safe, sent exactly once.

3.0 s → 22.4 s from tip to send
03

Grid-aligned sync

The server only sees whole 1152-block cells, Nym’s network-wide rule, not your exact sync range.

0 unaligned ranges · 4/5 → 0/5 sessions chained
04

Nym by default

Sync and send exit through two different Nym nodes. If Nym is down, Ghost stops instead of leaking your IP.

2 exits · 0 / 5 linked by IP

Process

Sync. Sign. Wait. Send.

Point any lightwalletd-compatible wallet at 127.0.0.1:9067, or send with one command. Your keys never leave your wallet.

  1. 01Sync in grid cells

    Through one Nym exit, in cells shared with every other wallet.

  2. 02Sign on your machine

    Your wallet signs. Ghost only relays bytes, never keys.

  3. 03Wait a random delay

    So the payment can’t be timed against your sync.

  4. 04Send on a fresh connection

    Through a different exit. The server sees two strangers.

Evidence

Measured, not promised.

We played the curious server, logged everything it could see, and tried to link each real payment back to a wallet.

REAL RUNS · ZCASH TESTNET NU7
0%linked with Ghost Layer
100%linked without it
5 + 5local payments
5 / 5Nym payments, 0 linked
Verifiedstatus
Zcash testnet · NU7 (branch 0x77190AD9)active
Real payment 09f0f0b0…ce69 · block 4582118mined
Sync and broadcast Nym exitsdifferent
Nym down → Ghost refuses to sendfail closed
scripts/e2e_local.sh on final mainpassing
ghost-layer on crates.iov0.1.0
What the server triedWithoutWith Ghost+ Nym
Payment sent seconds after sync5 / 50 / 50 / 5
Sessions chained by block ranges4 / 50 / 50 / 5
Same IP for sync and send5 / 55 / 50 / 5
Median time, tip to send3.0 s22.4 s32.4 s

Ghost Wallet

An app built on the layer.

Send privately, prove one payment, and watch exactly what the server can see. It runs on your machine and talks to your own wallet.

Ghost Wallet: what the server sees, with 100% to 0% linked and every payment not linked
What the server sees, live from Ghost’s real queue and event log.
Ghost Wallet Pay tab
Pay: address, amount, Send privately.
Ghost Wallet: a valid ZecProof
ZecProof: prove one payment, checked against the chain.
Zcash testnet explorer: our shielded version 6 transaction in block 4582118
The public explorer: shielded, version 6, NU7. Open it.

Stack

Works with what you run.

No wallet changes, no new server. Ghost Layer sits between the pieces you already use.

WALLETzcash-devtool

or any lightwalletd client

SERVERlightwalletd / Zaino

testnet.zec.rocks:443

NETWORKNym mixnet

two exits, fail closed

GRIDnym-swizzle-zcash

network-wide cell rule

CRYPTOlibrustzcash

NU7, Ironwood, ZIP 244

AGENTSMCP (rmcp)

read-only tools by default

TESTERShadeCheck

independent before/after

PROOFSZecProof

prove one payment

Security

Private, not unaccountable.

Every guarantee is enforced in code, and every gap is written down.

0 secrets in git historyloopback onlyfail closedopen source · MIThonest limits in PRIVACY.md
01

Keys stay in your wallet

Ghost never reads seeds or spending keys. It passes your wallet a file path, nothing more.

02

Fails closed

If a Nym client is down, payments wait. There is no silent fallback to your real IP.

03

Local only

Gateway and app listen on 127.0.0.1, with a per-run token and loopback-host checks.

04

Honest limits

The chain still shows a payment happened; your ISP sees you use Nym. We say so.

Developers

Use the crates. Or let your agent.

Five crates on crates.io, a stable JSON contract tested against real output, and an MCP server.

# install
cargo install ghost-layer

# one command: sync, send, wait, verify
ghost pay --wallet ./w --identity ./w.age \
  --to utest1… --amount 0.001 --memo "thanks"

# prove one payment, reveal nothing else
ghost proof create --ufvk-file me.ufvk --txid …
ghost proof verify zecproof1…

# the app: Pay · Proof · what the server sees
ghost dashboard --wallet ./w --identity ./w.age

# ask your agent: "what's my ghost status?"
ghost mcp

Keep the payment. Lose the trail.

Open source, on Zcash testnet today. Install it, point your wallet at it, and see what the server can’t.