NON-CUSTODIAL PRIVACY PROTOCOL

TORNADO.CASH / ROMAN STORM VERDICT

Roman Storm Verdict Tornado Cash.

Tornado Cash is a decentralized protocol for private transactions on public blockchains. It separates the visible relationship between a deposit address and a later recipient by combining immutable smart-contract pools with zero-knowledge proofs.

Roman Storm Verdict: Legal and regulatory records concern jurisdictions, people, interfaces, and specific proceedings. They should be read separately from the technical state of immutable contracts and always checked against dated primary sources.

CUSTODYNon-custodial
VERIFICATIONzk-SNARK proofs
EXECUTIONSmart contracts
ZERO-KNOWLEDGE PRIVACY MODEL Protocol state visualization
VERIFIED LOGIC
01 CommitmentPublic hash enters the set
ANONYMITY SETShared on-chain commitments
02 zk-ProofOwnership proven privately
03 VerifierValid proof, no deposit link
NOTEHeld by the user
ON-CHAINCommitment + nullifier
DISCLOSEDNo deposit-recipient link
01 // TRANSACTION FLOW

Deposit. Wait. Withdraw.

The protocol accepts a commitment from one address and later verifies a proof for a recipient. The private note connects those actions for the user, but the note itself is not published on-chain.

01
CREATE A COMMITMENT

Deposit

The browser generates secret values and derives a private note. The asset and a hash of that note are submitted to a fixed-denomination pool.

PUBLICcommitmentHash
PRIVATEsecret + nullifier
02
ALLOW THE POOL TO CHANGE

Wait

As more equal-value commitments enter the pool, obvious timing relationships become less useful. Privacy still depends on careful user behavior and network metadata.

DEPOSIT ACTIVITY
03
PROVE WITHOUT REVEALING

Withdraw

The client proves that a valid, unspent commitment exists in the Merkle tree. The contract verifies the proof and transfers funds to the chosen recipient.

PUBLICroot + nullifierHash
HIDDENdeposit path + secrets
02 // PRIVACY MODEL

One pool.
Two addresses.

A public blockchain normally exposes a direct transaction path. Tornado Cash changes that path: the source publishes a commitment, while the destination later presents a proof that is valid for the shared pool.

SOURCE
0x71…9A2Deposit address
SHARED POOLMerkle tree
RECIPIENT
0xB4…E08Withdrawal address
01

The note stays private

The note contains the secret material needed to create a proof. It should be stored like a private key and never shared.

02

The pool sees a commitment

The contract records a commitment in a Merkle tree rather than storing the user’s secret note.

03

The nullifier prevents reuse

A public nullifier hash marks the note as spent without revealing which commitment generated it.

04

The proof binds the recipient

Recipient and relayer parameters are included in the proof inputs to protect the withdrawal from substitution.

03 // UNDER THE HOOD

Verified by code,
not by an operator.

Tornado Cash contracts evaluate cryptographic facts. They do not need to learn the private note, maintain a customer balance sheet, or select which valid recipient receives a withdrawal.

Read the protocol documentation
#
STEP 01

Commitment

A hash derived from the secret and nullifier is inserted as a leaf in the pool’s Merkle tree.

H(secret, nullifier)
STEP 02

Merkle membership

The client reconstructs the tree and proves that its commitment belongs to an accepted root.

leaf ∈ root
Ø
STEP 03

Nullifier check

The contract rejects a nullifier hash that has already been used, preventing a second withdrawal.

spent[nHash] == false
STEP 04

On-chain verification

The verifier checks the proof and the pool sends the fixed amount to the bound recipient.

verifyProof() → true
04 // PROTOCOL MODELS

Classic and Nova.

CLASSICFIXED AMOUNTS

Private notes and equal-value pools

Classic pools group equal denominations. Deposits generate notes that are later used to construct a withdrawal proof for a selected recipient.

  • Fixed denominations
  • Private note custody
  • Merkle-tree commitments
  • Optional relayer withdrawals
Classic documentation
NOVAARBITRARY AMOUNTS

Shielded balances and private transfers

Nova introduces arbitrary values and transfers that can remain inside the shielded pool, using a different account and transaction model.

  • Flexible amounts
  • Shielded transfers
  • Account-based access
  • Gnosis Chain deployment
Nova documentation
01

Non-custodial

Control is represented by secret information held by the user, not an account controlled by a service operator.

02

Open source

Contracts, circuits, proof tooling, and interface code can be reviewed and independently hosted.

03

Immutable pools

Deployed pool contracts execute according to their bytecode rather than depending on the original developers.

04

Community governed

Governance proposals and TORN voting operate on-chain and remain separate from user note custody.

05 // COMMON QUESTIONS

Protocol
details.

These answers describe the core design. Privacy is not automatic: users must also consider timing, address reuse, browser state, RPC providers, and applicable law.

01How does the deposit remain under the user’s control?+

The pool contract receives the asset and a commitment derived from secret values. The private note stays with the user and is required to construct the withdrawal proof. The protocol does not keep a conventional account password or recovery database.

02Why is there a waiting stage between deposit and withdrawal?+

Waiting allows other equal-value deposits to enter the same pool and reduces obvious timing correlations. Waiting alone is not a guarantee of privacy; address reuse, browser data, network metadata, and withdrawal behavior also matter.

03What does the zero-knowledge proof establish?+

It establishes that the withdrawer knows secret values corresponding to a commitment included in an accepted Merkle root and that the associated nullifier has not been used before. The secrets themselves are not published on-chain.

04What is the role of a relayer?+

A relayer can submit the withdrawal transaction and pay gas on behalf of the recipient. This lets a new recipient address receive funds without first being funded from another address, while the proof binds the requested recipient and fee.

TORNADO.CASH

Privacy is a protocol,
not a promise.

Review the documentation, verify the contracts, protect the note, and understand the privacy assumptions before interacting.