Docs/Security
What Opaque does not hide
The edges of the guarantee, and how to work with them.
Opaque hides everything between a deposit and a withdrawal. The two ends are public. Here is what that means in practice and how to keep them from telling a story.
Amounts at the boundary
A deposit of 12,340 shares followed a day later by a withdrawal of 12,340 shares is not linked by the chain, but it is a guess anyone can make. Shield and unshield in round or common amounts, split unusual sizes across time, and do not withdraw exactly what you deposited.
Addresses at the boundary
Withdrawing to the wallet that deposited links the two on chain. Withdraw to a fresh address that has never touched your wallet.
Timing
A transfer that follows a deposit within the same minute, then a withdrawal a minute later, forms a pattern. The pool does not reveal the transfer, but the two public events bracket it. Let time pass.
Fees in the asset
A relayed transfer that pays a fee in the asset reveals that asset on chain. Zero-fee transfers reveal nothing.
Network metadata
The server sees the IP address that submits a relay request and syncs the tree. It does not see which notes are yours, but a traffic pattern is a pattern. Use the app over a connection you would use for anything else you consider private.
The size of the crowd
Every transaction hides among every other note in the tree, across all assets. The guarantee is only as strong as that crowd is large and active. Opaque publishes the pool's activity so you can judge it.
Your own device
Your keys live in your browser's memory for the length of a session, derived from a signature. A compromised device or a phished signature compromises the account. Sign the account message only on the app.