What's public and what's private
The edges of the pool are public, and the path between them is private. Here is what each payment shows.
A normal SPL transfer shows everything: the sender, the recipient, the token and the amount. With Nimbus, the way in and the way out still look like that. Everything in between is private.
What each payment shows
These cards show what anyone reading Solana can see, and what stays private.
- Your user's wallet, which pays the fee
- Their platform wallet, which signs
- Their identity, now tied to both wallets
- A hash of their encryption key
- Their keys
- The depositing address: the user's platform wallet
- The token and the exact amount
- Whose private balance receives it
- How the amount is split into notes
- The zone it goes to
- That a relayer sent a transaction
- The relayer's tip, amount and token, if one is paid
- The sender
- The recipient
- The token and the amount
- The zone
- The receiving address
- The token and the exact amount
- Who withdrew
- Which notes paid for it
- The change left behind
A zone is a group of notes within the pool. Most apps use the default zone and never set one.
How privacy narrows
The proofs reveal nothing about the notes they spend. Privacy can still narrow in these ways:
- Registration ties the wallets together. Anyone can see that your user's wallet and platform wallet belong to one account. So a deposit can be traced to your user.
- Amounts and timing can match. A withdrawal of the amount just deposited, soon after, suggests the same person. The chain records no link, but the pattern is there.
- A known destination gives it away. If the withdrawal address is already tied to your user, so is the withdrawal.
- The relayer's tip is public. The SDK pays it in the token being moved, so a tip shows which token moved.
- The recipient learns the sender. A Private Send records the sender's identity in the new notes. Bob can read it and follow it to Alice's wallets.
- Rare tokens and schedules stand out. A token few people use, or payments at the same hour every week, are easier to group.
What this means for your app
- Don't suggest an instant round trip. Value that stays in the pool for a while, with other activity in between, is harder to pair.
- Don't default to withdrawing what was deposited. Different amounts remove the easiest match.
- Let users choose where to withdraw. Withdrawing to the wallet that deposited links the two ends. Say so beside the address field.
- Tell senders that recipients will know them. A Private Send is private from everyone except the person paid.
- Keep the sign-in on the device. Whoever has the stored signature has the account. See The private account.
The protocol documentation covers each point in depth:
Last updated