Reference file / zero-knowledge protocols
Tornado Cash and the cryptography of on-chain privacy
Tornado Cash is a non-custodial privacy protocol on Ethereum that uses zero-knowledge proofs to break the public link between a deposit address and a withdrawal address. Anyone can send a fixed amount of ETH or a supported token into a shared pool, wait, and later prove ownership of a deposit without revealing which deposit it was. The same design that made Tornado Cash a landmark of applied cryptography also placed it at the center of the largest legal argument so far about whether software can be sanctioned and whether writing it is a crime. This page walks through how Tornado Cash works, what its privacy actually guarantees, and where the law now stands.
What it is and what it was for
Tornado Cash is not a company, a custodian, or a service in the ordinary sense. It is a family of smart contracts deployed to Ethereum starting in 2019, together with the client-side code needed to talk to them. When someone uses Tornado Cash, the funds land in a pool contract next to deposits from everyone else who picked the same denomination. The contract has no idea who anyone is, and no operator holds a key that can move the money or reverse a transaction. Tornado Cash therefore behaves less like a business and more like a public utility written in Solidity.
The problem Tornado Cash was built to address comes from Ethereum's own design. Every transfer, balance, and contract call is public and permanent, so a salary paid on-chain, a political donation, a medical payment, or a company's treasury operations are visible to competitors, employers, landlords, and anyone running a block explorer. Address clustering makes this worse over time, because a single careless link can attach a lifetime of activity to a real name. Tornado Cash offered a way to spend funds without dragging that entire history along.
What made Tornado Cash technically notable is that it needs no trust at all. There is no operator to keep logs, no server that could be subpoenaed for a mapping of deposits to withdrawals, and no privileged account behind the main pools. The privacy guarantee rests on mathematics rather than on a promise. The uncomfortable flip side is that the same guarantee applies to every user equally, including criminals, and that is precisely the tension that followed Tornado Cash into courtrooms on two continents.
How the protocol works
The deposit
A deposit into Tornado Cash starts in the user's browser, not on the chain. The client generates two random values, conventionally called the nullifier and the secret, and hashes them together into a single value called the commitment. Only the commitment is sent to the contract along with the money. Tornado Cash inserts that commitment as a leaf in an incremental Merkle tree and records the new tree root. The pair of random values is written into a string the user must save, the deposit note, which functions as the only key to those funds.
The withdrawal
To withdraw, the user takes the note, reconstructs the secret values, and builds a zero-knowledge proof off-chain. The proof asserts that the person holds a note whose commitment sits somewhere in the tree, without saying where. Along with the proof, the client publishes the hash of the nullifier. Tornado Cash checks the proof against a stored root, checks that this nullifier hash has never been seen before, marks it as spent, and pays out the denomination to whatever recipient address the proof commits to. Because the recipient is bound inside the proof, nobody can intercept a withdrawal and redirect it.
$ deposit commitment = pedersenHash(nullifier, secret) tree.insert(commitment) # depth 20, MiMC hashing note = "tornado-eth-1-1-0x<nullifier><secret>" # keep offline $ withdraw proof = prove(root, nullifierHash, recipient, relayer, fee) require(isKnownRoot(root)) require(!nullifierHashes[nullifierHash]) nullifierHashes[nullifierHash] = true send(denomination - fee -> recipient)
What the proof actually proves
In plain language, the statement verified by Tornado Cash is: "I know the secret values behind one of the commitments in this tree, and I have not spent it before." Nothing in that statement identifies the leaf. The verifier learns only that the claim is true, which is the defining property of a zero-knowledge proof. The circuit is proved with Groth16 over the BN254 curve, chosen because verification is cheap enough to run inside an Ethereum transaction while proof generation stays feasible on a laptop.
Setup and immutability
Groth16 requires a one-time parameter generation step per circuit, and a party that keeps the leftover randomness could forge proofs. Tornado Cash addressed this with a public multi-party ceremony in which many independent contributors each added entropy, so the setup stays sound as long as at least one participant destroyed their share honestly. It is a real assumption, and anyone auditing Tornado Cash should treat the ceremony as part of the trust model rather than a footnote.
The core pool contracts of Tornado Cash were deployed without an owner, an upgrade path, or a pause function. That decision was deliberate, and it later turned out to be the most consequential engineering choice in the project's history: when governments, hosting providers, and front-end operators withdrew support in 2022, the contracts themselves kept accepting deposits and honoring withdrawals exactly as written, because there was nobody left with the power to stop them.
Fixed denominations and supported assets
Amounts are the easiest way to deanonymize a mixer. If one person deposits 7.431 ETH and someone withdraws 7.431 ETH an hour later, no cryptography can hide the connection. Tornado Cash solved this by refusing arbitrary amounts entirely. Each Tornado Cash pool accepts exactly one denomination, so every deposit inside a pool is byte-for-byte interchangeable with every other. A user moving a larger sum makes several deposits into the same pool or spreads across pools, and each deposit gets its own note.
| Asset | Pool denominations | Note |
|---|---|---|
| ETH | 0.1 / 1 / 10 / 100 | Deepest and most used pools |
| DAI | 100 / 1,000 / 10,000 / 100,000 | ERC-20 pools use an approve step first |
| cDAI | 5,000 / 50,000 / 500,000 / 5,000,000 | Interest-bearing wrapper, thin usage |
| USDC / USDT | 100 / 1,000 | Issuer can freeze balances at the token layer |
| WBTC | 0.1 / 1 / 10 | Smallest anonymity sets of the set |
Denomination choice matters more than most users realize. A pool holding tens of thousands of deposits gives a withdrawal a large crowd to hide in, while an exotic pool with a handful of lifetime deposits gives almost none. This is why the practical privacy of Tornado Cash was never uniform across assets: the ETH pools behaved very differently from the rarely touched ones, and the token pools carried an extra risk because a stablecoin issuer can freeze specific balances regardless of how well the mixing worked. For that reason, careful write-ups on Tornado Cash always pointed users toward the deepest pool available for their asset.
Relayers and the gas problem
There is a subtle failure mode in any private withdrawal: someone has to pay gas. If a brand new address has to be funded with ETH before it can submit a withdrawal, whoever funded it has just written the link that the whole scheme was supposed to erase. Tornado Cash handles this with relayers, third parties who broadcast the withdrawal transaction on the user's behalf and take a fee out of the withdrawn amount. Relayers in Tornado Cash are not custodians and never touch the pooled balance, so the recipient address needs no prior funding and never appears as the transaction sender.
Relayers cannot cheat, because the recipient address and the fee are both fixed inside the zero-knowledge proof; a relayer that alters either one produces an invalid transaction. What a relayer can do is observe metadata, such as the IP address that submitted the proof and the timing of the request, which is why relayer choice and network-level hygiene were always part of using Tornado Cash properly. Later versions of the protocol added an on-chain relayer registry with staked TORN, intended to make it costlier to run relayers that harvest user data or advertise dishonestly.
Anonymity sets and what still leaks
The cryptography inside Tornado Cash is not the weak point. Users are. The proof hides which leaf a withdrawal spends, but it cannot hide the shape of a user's behavior, and chain analysis firms built a whole practice around exactly that gap. The relevant measure is the anonymity set: the number of deposits in the same pool that a given withdrawal could plausibly correspond to, once every observable clue has been used to eliminate candidates.
Several patterns shrink that set dramatically. Depositing and withdrawing within a few minutes narrows the candidates to whoever was active in that window. Withdrawing an unusual combination of denominations, such as one 100 ETH note plus three 10 ETH notes, produces a fingerprint that may match only a single depositor. Sending funds straight from the withdrawal address back to a known exchange account, or reusing an address that already has a public history, reintroduces the link at the other end. None of these leaks come from a flaw in Tornado Cash itself; they live entirely outside the circuit, on either side of the pool.
Anyone studying Tornado Cash as a case study in privacy engineering should take away the general lesson rather than the specific tool. Cryptographic unlinkability is fragile at the edges, and it degrades toward zero as soon as the surrounding metadata is distinctive. The documented practices for keeping an anonymity set large were straightforward but demanded patience, which is a poor match for how most people actually transact.
Factors that erode an anonymity set
- Short delay between deposit and withdrawal
- Rare denominations with few lifetime deposits
- Distinctive multi-note withdrawal combinations
- Reusing an address with existing public history
- Paying withdrawal gas from a linked wallet instead of using a relayer
- IP-level correlation between the deposit and withdrawal sessions
TORN, governance and incentives
A governance token called TORN was introduced in late 2020, with an airdrop to early users of the ETH pools, and on-chain governance began operating in 2021. Token holders could lock TORN to vote on proposals covering the relayer registry, treasury spending, incentive parameters, and new deployments. Importantly, this governance never gained authority over the original pool contracts of Tornado Cash, which remained immutable, so votes could shape the periphery but not the core.
One of the more interesting mechanisms attached to Tornado Cash was anonymity mining. Because privacy improves when deposits sit in a pool for a long time, the protocol rewarded depositors with anonymity points that scaled with how long their notes stayed unspent, redeemable for TORN through a shielded accounting system so that claiming a reward did not itself reveal the deposit. It was a genuine attempt to pay users for producing a public good, and it also showed how hard it is to add token incentives to a privacy system without opening new correlation channels. Anonymity mining was eventually wound down, but it remains one of the more original ideas Tornado Cash produced.
Governance also produced the project's sharpest self-inflicted wound. In May 2023 an attacker slipped malicious logic into a proposal that looked routine, passed it, and briefly took control of the governance contract and a large block of voting power before control was returned. The episode is now a standard reference for how proposal review, not just contract audits, belongs in the threat model of any decentralized organization, and it happened to Tornado Cash while the protocol was already under intense legal pressure.
Selective disclosure and the compliance tool
Privacy and secrecy are not the same thing, and Tornado Cash tried to make that distinction concrete. Because the deposit note is the only object that ties a deposit to its withdrawal, the note holder can choose to reveal that connection to a specific counterparty. The Tornado Cash compliance tool let a user turn a note into a report proving that a particular withdrawal came from a particular deposit, which an exchange, auditor, or tax authority could verify against the chain.
This is what cryptographers call selective disclosure: the user, not the network, decides who learns the link. In practice adoption was limited, since compliance departments were rarely set up to evaluate a proof of that kind, and after 2022 many institutions simply refused any funds that had touched Tornado Cash regardless of documentation. The mechanism still matters as design precedent, because it demonstrates that a privacy pool does not have to be an all-or-nothing black box.
Classic pools, Nova and custodial mixers
The fixed-denomination design used by the main Tornado Cash pools is only one implementation of the idea. A second deployment, Tornado Cash Nova, launched on Gnosis Chain in late 2021 as an experimental system that accepted arbitrary amounts and supported shielded internal transfers between accounts inside the pool, trading the simplicity of identical deposits for flexibility. Both differ fundamentally from the custodial tumblers that preceded them, where users hand coins to an operator and hope the operator returns different ones and keeps no records.
| Criterion | Tornado Cash classic pools | Tornado Cash Nova | Custodial mixer |
|---|---|---|---|
| Custody of funds | None, contract holds pooled deposits | None, shielded balances in contract | Operator holds funds outright |
| Amounts | Fixed denominations only | Arbitrary | Arbitrary |
| Trust assumption | Circuit setup ceremony | Setup ceremony plus newer, less tested code | Operator honesty and log deletion |
| Exit scam risk | Not possible for pool funds | Not possible for pool funds | High |
| Recovery if key or note is lost | Impossible | Impossible | Depends on operator |
| Network | Ethereum mainnet, plus other EVM deployments | Gnosis Chain | Off-chain, operator infrastructure |
Sanctions, courts and the public record
On August 8, 2022, the U.S. Treasury's Office of Foreign Assets Control added Tornado Cash and a long list of associated Ethereum addresses to the Specially Designated Nationals list. The announcement stated that more than seven billion dollars in virtual currency had been laundered through the protocol since 2019, including hundreds of millions stolen by the North Korea-linked Lazarus Group. It was the first time the sanctions regime had been pointed at autonomous software rather than a person, a company, or a vessel, and OFAC re-designated Tornado Cash later that year under authorities tied to North Korea.
The practical effects arrived within days. Code repositories and developer accounts were taken down, the project's chat server disappeared, some infrastructure providers stopped serving requests to the contracts, a stablecoin issuer froze balances at sanctioned addresses, and mainstream applications began blocking wallets that had received funds from the pools. A stunt followed in which small amounts were sent from Tornado Cash to the public addresses of celebrities, illustrating that anyone could taint anyone else's wallet without consent. Critics also disputed the headline figure, noting that it measured all volume through the pools rather than the criminal share of it.
Figures cited in the August 2022 designation
Total volume alleged laundered since 2019
Portion attributed to the Lazarus Group
Source: figures stated in the U.S. Department of the Treasury announcement of August 8, 2022. These are government allegations about aggregate volume, not adjudicated findings about individual users. Background on the designation and its reversal is summarized on Wikipedia.
Prosecutions
Developer Alexey Pertsev was arrested in the Netherlands in August 2022 and convicted of money laundering by a Dutch court in May 2024, receiving a sentence of 64 months; he was later released under electronic monitoring while pursuing an appeal. In the United States, prosecutors charged Roman Storm and Roman Semenov in August 2023 with conspiracy counts including money laundering, sanctions violations, and operating an unlicensed money transmitting business. Storm's trial ended in August 2025 with a conviction on the unlicensed money transmitting count and a deadlocked jury on the rest. Semenov, who was also sanctioned individually, has not been in U.S. custody. The charges in both countries target people who built and promoted Tornado Cash, not the users of the pools.
Meanwhile the designation itself was challenged in court. In November 2024 the U.S. Court of Appeals for the Fifth Circuit ruled in favor of plaintiffs who argued that the immutable smart contracts behind Tornado Cash are not "property" and cannot be owned or controlled by anyone, and therefore fall outside the statutory authority OFAC had used. In March 2025 the Treasury removed Tornado Cash and the associated addresses from the SDN list, an unusual reversal that turned the case into the reference point for how sanctions law applies to unowned code.
The legal story around Tornado Cash split into two separate questions that are easy to confuse: whether a set of ownerless contracts can be sanctioned, and whether the individuals who wrote and promoted the software bear criminal responsibility for how others used it. The first was answered in the negative on appeal. The second is still being worked out.
None of this is legal advice, and the delisting did not make the surrounding rules disappear. Anti-money-laundering obligations, other jurisdictions' regimes, and the risk policies of individual exchanges all continue to apply independently. Many compliance systems still score funds that passed through Tornado Cash as elevated risk, which means a technically legal transaction can still result in a frozen account or a rejected deposit.
Timeline of key events
The short version of the Tornado Cash story, from a research curiosity to a test case in sanctions law. Dates reflect widely reported public events.
-
2019
First Tornado Cash pool contracts deployed to Ethereum mainnet, using zk-SNARK membership proofs over fixed denominations.
-
Late 2020 to 2021
TORN distributed to early users and on-chain governance begins, alongside the relayer registry and anonymity mining experiments.
-
December 2021
Tornado Cash Nova launches on Gnosis Chain with arbitrary amounts and shielded transfers.
-
August 2022
OFAC sanctions Tornado Cash; code repositories and community channels are removed; Alexey Pertsev is arrested in the Netherlands.
-
Late 2022
Lawsuits are filed challenging the designation, and OFAC re-designates Tornado Cash under North Korea-related authorities.
-
May 2023
A malicious proposal briefly captures the Tornado Cash governance contract before control is handed back.
-
August 2023
U.S. prosecutors charge two developers associated with Tornado Cash; one is arrested, the other remains outside U.S. custody.
-
May 2024
A Dutch court convicts Pertsev of money laundering and imposes a 64-month sentence.
-
November 2024
The Fifth Circuit holds that the immutable Tornado Cash contracts are not property subject to blocking sanctions.
-
March 2025
The Treasury delists Tornado Cash and its associated addresses from the SDN list.
-
August 2025
The U.S. trial of Roman Storm ends in a partial verdict, with a conviction on one count and no verdict on the others.
Common misconceptions
"It shuffles coins"
Nothing is shuffled and no coins are swapped between users in Tornado Cash. Tornado Cash simply pools identical deposits and pays out against a proof of membership, so the money leaving a pool is fungible with everything else inside it.
"Withdrawals are untraceable"
The proof hides the specific deposit, but timing, denomination patterns, and downstream address behavior have repeatedly allowed analysts to link activity around Tornado Cash. Unlinkability is probabilistic and depends on the user's discipline.
"Someone can shut it down"
Front-ends, repositories, and relayers can be removed, and they were. The core pool contracts of Tornado Cash have no owner and no upgrade key, so the deployed code stays available on-chain regardless of who stops interacting with it.
Frequently asked questions
Is Tornado Cash a company?
No. Tornado Cash is open-source software and a set of deployed smart contracts. Individual developers built and promoted it, and a token-based governance structure existed around its periphery, but there is no firm that takes deposits, employs support staff, or can freeze an account.
Do the contracts still exist now that sanctions were lifted?
The deployed bytecode of Tornado Cash has been on Ethereum continuously since it was published, throughout the designation and after the March 2025 delisting, because immutable contracts cannot be deleted. What changed over that period was the availability of interfaces, relayers, and third-party services around them.
What happens if a deposit note is lost?
The funds become unrecoverable. The note contains the only values that can produce a valid withdrawal proof, and nobody, including the original depositor and the developers of Tornado Cash, has any recovery path. This is a direct consequence of the non-custodial design rather than a bug.
What was Tornado Cash Nova?
Nova was the experimental second design, deployed on Gnosis Chain, that let users deposit arbitrary amounts and move shielded balances between accounts inside the pool. It was always smaller and less battle-tested than the fixed-denomination Tornado Cash pools on Ethereum mainnet.
How is this different from a Bitcoin CoinJoin?
A CoinJoin builds one joint transaction from several participants who must coordinate and be online at the same time, and the resulting transaction is visible on-chain. Tornado Cash needs no coordination at all: depositors and withdrawers never interact, and the connection is hidden by a zero-knowledge proof instead of by ambiguity in a shared transaction.
Was it only used by criminals?
No, and this was central to the public argument. Documented uses of Tornado Cash included donations to causes in conflict zones, protecting salary and treasury payments from public view, and ordinary users trying to avoid publishing their net worth. Serious theft proceeds also moved through the pools, and honest analysis has to hold both facts at once.
Is it legal to use today?
This page is informational and not legal advice. The removal of Tornado Cash from the U.S. SDN list in 2025 lifted the specific blocking prohibition, but money laundering law, reporting obligations, other national regimes, and private risk policies still apply. Anyone facing a real decision should consult a qualified lawyer in their jurisdiction.
Why does it matter beyond crypto?
Because it forced a concrete answer to an abstract question: what happens when a tool has no operator to regulate. The rulings and prosecutions connected to Tornado Cash now shape how developers think about publishing privacy software, and how regulators think about targeting it.