|=[ RESEARCH :: FILE 03 ]=

HOW MUCH STEALTH DOES A STEALTH ADDRESS GET YOU?

UMBRA · FLUIDKEY · CLOAKED · MAINNET + L2s

Stealth addresses promise two things: an observer cannot tell who was paid, and cannot tell that two payments went to the same person. I measured how three generations of EVM stealth protocols actually perform on that promise, using nothing but public data: every Umbra announcement on mainnet and four L2s, the entire Fluidkey Safe census, and every Cloaked merge, from October 2021 to September 2026. The receive side works. The moment money moves, most active users link themselves.

ORIGINAL RESEARCH 3 PROTOCOLS PUBLIC DATA ONLY

DATA · OCT 2021 → SEP 2026 · MAINNET + L2s

24,988
Umbra payments
mainnet, to 11,578 registrants
61.2%
Linked at the spend
Umbra mainnet, active receivers
73.3%
Linked on L2s
266,339 announcements, 4 chains
44.3%
Fluidkey Safes linked
12,697 of 28,681 observable
51
Stealth EOAs, one click
the largest Cloaked merge

EVERY DATASET PUBLIC: EVENT LOGS, EXPLORER APIS, ENS REVERSE RECORDS, THE OPEN WEB

THE HANDSHAKE

Give someone your Ethereum address and you hand them your financial history. Every payment you have ever received, every token you hold, every counterparty you have ever touched, are all indexed, searchable, and permanent. This transparency is a feature of the blockchain.

Stealth addresses are the protocol-level answer to this transparency. The idea predates Ethereum, it comes from the Bitcoin dark-wallet era and was industrialized by Monero. The EVM version is now standardized as ERC-55641 and ERC-65382, and the mechanics are quite elegant. You publish a pair of public keys once. When someone pays you, their wallet performs a little elliptic-curve handshake with your keys and derives a fresh, one-time address that has never appeared onchain before. To the chain, the payment goes to a stranger. Only your viewing key can detect that the stranger is you, and only your spending key can move the money.

Stealth addresses have two clauses:

  • Anonymity: an observer cannot tell who was paid.
  • Unlinkability: an observer cannot tell that two payments went to the same person.

The stealth handshake

one published keypair, one ephemeral key, a fresh one-time address per payment · ERC-5564 / ERC-6538

RECIPIENT publishes once, onchain (registry) spending pubkey S = s·G viewing pubkey V = v·G keeps secret: s, v scans every Announcement SENDER per payment, fresh randomness ephemeral secret e (random) ephemeral pubkey E = e·G publishes E in the Announcement pays the derived address V E shared secret e·V = v·E (ECDH) hash into a scalar, add to S stealth pubkey P = S + hash(e·V)·G → address(P): never seen onchain before viewing key v: detects the payment · spending key s: moves the money · observer: sees a stranger paid
The elliptic-curve handshake every stealth wallet performs: the sender combines their ephemeral key with the recipient's published viewing key, and both sides arrive at the same one-time address. Only the recipient can recognise or spend from it.
The stealth handshake — one published keypair, one ephemeral key, a fresh one-time address per payment

This essay explores three generations of EVM stealth protocols, using nothing but public data; event logs, public explorer APIs, ENS reverse records, and the open web. Stealth addresses are useful for receiving money, but many users link their identity when sending the funds on. I measure how three generations of stealth protocols actually perform.

THREE GENERATIONS

Umbra (2021) is the registry era. Your stealth public keys are published onchain in a StealthKeyRegistry, bound by a signature to your wallet, forever. A sender reads your keys from the registry, derives a fresh address, pays it, and the contract emits an Announcement, an ephemeral key and the stealth address, for your viewing key to scan.

When you want the money, you withdraw it yourself, from the stealth address, with your own transactions. It is the purest design of the three. There is no operator, no servers, and nothing to subpoena. It is deployed across Ethereum Mainnet, Arbitrum, Optimism, Polygon, Base, and Gnosis.

The design consequence is equally pure: registration is a permanent, public identity anchor, and every withdrawal is a user-signed transaction that can be seen by anyone.

Umbra · the registry era (2021)

ERC-5564 + ERC-6538, built by ScopeLift · mainnet, Arbitrum, Optimism, Polygon, Base, Gnosis

STEP 1 · REGISTERpublish stealth keysspending + viewing pubkeys gointo the onchain registry,by your everyday walletpermanent · public · onceSTEP 2 · RECEIVEsender pays a strangersender reads keys from registry,derives a fresh address,pays it; contract emits anAnnouncement for yourviewing key to scanSTEP 3 · SPENDyou withdraw yourselfyou sign the withdrawal fromthe stealth address, with yourown transactionno operator · nothing to subpoenaLEAK: registration anchors identity foreverLEAK: the linking tx is yoursthe purest design of the three: no servers, no operator · but every touchpoint is public37.0% of registrants used a public ENS name · 8 users have ever rotated keys
The registry makes receiving trustless and enumerable in equal measure: anyone can pay you, and anyone can list every registrant. Withdrawal is self-signed, so the linking transaction is the user's own.
Umbra, the registry era — keys published in an onchain registry, users withdraw themselves

Fluidkey (2024) is the smart-account era, and its first move was to delete the registry. Keys are derived client-side from a wallet signature; with Fluidkey's backend holding a BIP-32 viewing-key node so it can scan on your behalf. You get an username.fkey.eth name, but it is sealed: an offchain CCIP gateway returns a fresh stealth address on every resolution, and zero subnames ever touch the ENS registry.

Your stealth account is a counterfactual 1-of-1 Safe smart account, deployed only when you first spend from it, at the same address on every chain. An optional auto-earn module sweeps your balances into yield vaults, operated by Fluidkey's own relayer. Fluidkey stopped the registry leak, but in its place, a proprietary module-and-relayer stack that turns out to leave a rich, enumerable operational footprint. I enumerated the entire user base in an afternoon.

Fluidkey · the smart-account era (2024)

no onchain registry · sealed usernames · counterfactual Safe accounts · Base

STEP 1 · DERIVEno registry at allkeys derived client-side froma wallet signature; you get asealed username.fkey.ethzero subnames touch ENSSTEP 2 · RECEIVEgateway serves addressesoffchain CCIP gateway returns afresh address per lookupyour account: a counterfactual1-of-1 Safe, same addresson every chainSTEP 3 · SPENDthe operator runs itSafe deploys at first spend;relayer + auto-earn modulesweep balances to yield vaultsbackend holds viewing keyssealed: registry leak is goneLEAK: operator sees everythingenumeration moves offchain, to the operator: one submitter EOA, one batcher, one relayer31,263 Safes enumerated in an afternoon · 44.3% of observable Safes linked
Deleting the registry fixed enumeration by the public and handed it to the operator: the backend scans for you, the relayer acts for you, and both leave a measurable operational fingerprint.
Fluidkey, the smart-account era — no registry, counterfactual Safes, a proprietary module and relayer stack

Cloaked (2026) is the gateway-and-7702 era. Your username.clkd.eth resolves through a CCIP gateway that mints a fresh stealth EOA on every query. The backend holds the child viewing key and, by its own documentation, sees everything. It cannot move your money, but nothing you do is private from it. Your receive page at username.clkd.id is a public web page that rotates a fresh address on every visit.

Spending is where it gets interesting: your stealth EOAs are converted into smart accounts via EIP-7702 delegations to Porto accounts, executed through a public Orchestrator and relayed by Cloaked's servers. Merging several stealth accounts into a single spend is not an accident; it is a product feature: a UX trade-off that unifies your receiving addresses. There is even an optional 0xbow Privacy Pools integration for "incognito balances," which can add more privacy.

Cloaked · the gateway-and-7702 era (2026)

gateway-minted EOAs · rotating receive pages · EIP-7702 spends via Porto · Base + Ethereum

STEP 1 · NAMEusername.clkd.ethresolves via CCIP gateway,minting a fresh stealth EOAon every queryreceive page rotates addresson every visitSTEP 2 · RECEIVEcryptographically pristinefresh one-time EOA perresolution; zero duplicatesacross namesbackend holds child viewingkey: watches, can't spendSTEP 3 · SPEND7702 + orchestratorEOAs become smart accounts viaEIP-7702 delegation to Porto;public Orchestrator executes,Cloaked relaysmerging accounts is a featureLEAK: usernames enumerable + Google-indexedLEAK: every merge is a confession69 usernames recovered from ~9,000 probes · 1,475 live receive addresses watchlisted100% of 550 decoded multi-EOA spends are single-user · 61.1% of Ethereum spenders self-welded
Receiving is done exactly right; the leaks live at naming and spending. The username layer is enumerable through two oracles and Google, and the flagship merge feature proves common ownership onchain.
Cloaked, the gateway-and-7702 era — fresh address per query, merges executed through a public orchestrator

The generational pattern is the first real finding of this study. Each protocol fixed the previous generation's onchain leak, but introduced a new one somewhere else. Umbra leaked at registration. Fluidkey sealed the registry and leaked at operations. Cloaked sealed the registry and the receive layer, and leaks at naming and spending.

Three generations, side by side

Umbra, Fluidkey, Cloaked: same handshake, three architectures, three different leaks

Umbra (2021)Fluidkey (2024)Cloaked (2026)
Key publicationonchain registry (ERC-6538), signed by your wallet, permanentnone; keys derived client-side from a wallet signaturenone; gateway mints a fresh EOA per resolution
Enumerationeveryone; the registry is publicoperator only; usernames sealedoperator only; but usernames enumerable via oracles and Google
Announcementonchain events with view tags; any wallet can scannone; backend scans for you (holds a viewing-key node)none; gateway hands each sender a fresh address
Receiving accountone-time EOAcounterfactual 1-of-1 Safe, same address every chainone-time EOA, upgraded to a 7702 smart account at spend
Spend pathyou sign the withdrawal yourselfrelayer + module stack executespublic Orchestrator executes; Cloaked relays; merges are a feature
Trust surfacenone; pure contractsoperator sees everythingcustodial-grade; server holds child viewing keys
Main leakregistration anchors identity (37% ENS-named); self-withdrawalwelds at funders and cash-out destinationsusername enumeration; merge-at-spend
Observed linked61.2% of active receivers (mainnet)44.3% of observable Safes61.1% of Ethereum spenders
Each generation sealed the previous one's leak and opened a new one somewhere else. Umbra leaks at registration, Fluidkey at operations, Cloaked at naming and spending. The leak moves; it does not shrink.
Three generations side by side — Umbra, Fluidkey, Cloaked: same handshake, three architectures, three different leaks

NOT SO STEALTHY

There are two important definitions before we dive in:

  • Linked - means an observer can prove that two or more stealth accounts share an owner, or tie a stealth account to a known wallet.
  • Named - means linked to a human-readable identity: an ENS name or a published username.

On Ethereum mainnet, Umbra processed 24,988 stealth payments to 11,578 registrants. Of all payments, 56.2% are linkable to a publicly known wallet. Since 8.1% of recipients never touched their funds at all, this figure increases to 61.2%, among users who actually used the system. One in five payments, 21.3%, resolves to a human-readable ENS name. The largest single user's cluster contains 131 stealth addresses.

Kovács and Seres (2023)3, deanonymized 48.5% of Umbra Ethereum mainnet payments with data through mid-2023. With three more years of chain history and two additional heuristics, that figure rises 12.7 points to 61.2% of active receivers. Every additional transaction gives an analyst another opportunity to link addresses.

Across L2s, where Umbra is also deployed, I ran the same treatment on 266,339 announcements, ~11 times mainnet volume. The result is worse than mainnet: 73.3% of active receivers are linkable: Arbitrum 76.0%, Base 77.4%, Optimism 69.8%, and Polygon 72.2%.

The mainnet essay is the small print

Umbra stealth payments per chain, genesis – Aug 2026 · 266k L2 announcements = 10.7× mainnet volume

025k50k75k100kPolygon102,549Arbitrum100,138Optimism58,048Ethereum mainnet24,988Base5,604
Announcement events re-indexed on all five chains. L2 withdrawal graphs censused and analysed: 73.3% of active L2 receivers are linkable, worse than mainnet on every chain.
The mainnet essay is the small print — Umbra stealth payments per chain, L2 volume at 10.7 times mainnet

Fluidkey has 31,263 stealth Safes on Base. Of the 28,681 I could observe onchain, 44.3% are linkable through shared withdrawal destinations, shared funders, and atomic co-creation: 40.6% of the entire census. A tenth of all Safes were born pre-linked, before moving a single cent.

Cloaked has 4,321 spend EOAs across Base and Ethereum. 40.1% of Base spenders and 61.1% of Ethereum spenders welded their stealth accounts together in the very act of spending. One user merged 51 one-time addresses in a single transaction.

How much gets linked, per protocol

share of the population an observer can weld to a common owner or known wallet, public data only

0%20%40%60%Cloaked · Ethereumspenders linked at spend time61.1%Umbra · mainnet (active)of users who ever withdrew61.2%Umbra · mainnet (all)of all payments56.2%Fluidkey · Baseof observable Safes44.3%Cloaked · Basespenders linked at spend time40.1%
Umbra: 14,053 of 24,988 payments (61.2% of the 22,952 ever-withdrawn). Fluidkey: 12,697 of 28,681 observable Safes. Cloaked: 1,405/2,301 Ethereum and 856/2,135 Base spend EOAs in merge clusters.
How much gets linked, per protocol — share of the population an observer can weld to a common owner or known wallet

DOXXED AT HELLO

Umbra's registry binds your stealth keys to your everyday wallet with an onchain signature. That transaction is public, permanent, and, crucially, usually sent from the wallet you use for everything else. I reverse-resolved every registrant in the registry's history: 4,286 of 11,578 mainnet registrants (37.0%) registered from addresses with public ENS names. Before receiving a single private payment, more than a third of Umbra's user base had given their identity to their stealth keys.

The registration is also effectively forever. Across the registry's whole history there were 111 re-registrations, of which 103 were UI double-submits. Only eight users have ever rotated their keys. One registration is a lifetime identity anchor, and the protocol gives you no reason and no easy way to change it.

The most striking pattern in the registry is who shows up when it hurts. During the May to July 2022 contagion, when the UST collapse cascaded into Celsius and 3AC, registrations spiked to 617 in a single week, and that crisis cohort was 51.3% ENS-named, against a 37% baseline. Panic drives people to privacy tools, wanting to move money without being seen, but it drives them there with their most doxxed wallet in hand. There are also 192 blocks containing three or more registrations (one block holds 33): the fingerprints of bulk operators mass-registering hundreds of named identities, roughly a tenth of all users.

Privacy panics in a crisis

Umbra stealth-key registrations on Ethereum mainnet, weekly, Oct 2021 – Aug 2026

0200400600617 in one week: UST → Celsius → 3AC contagionthat crisis cohort is 51.3% ENS-named, vs 37% baselineJan 2022Jan 2023Jan 2024Jan 2025Jan 2026Aug 2026
11,714 registration events re-indexed from the StealthKeyRegistry. Shaded band: May–July 2022 contagion. Every spike is a scare, and the scared arrive with their named main wallets.
Privacy panics in a crisis — weekly Umbra registrations spiking during the May to July 2022 contagion

THE SELF-PAYMENT LOOP

Registration doxxes the keys, and withdrawal doxxes the payments. Umbra users withdraw from their stealth addresses themselves, and where those withdrawals land is the single most destructive fact in this study: 8,932 stealth addresses, 35.7% of all, swept their funds to an address that is itself a registered Umbra key-holder. The user receives privately, then sends the money to a wallet the whole world can see registered. In one transaction, they totally deanonymize that payment.

The sender side completes the circle, and it is darkly funny: 391 users paid a stealth address and then withdrew the funds back to the exact same wallet that sent them. A full self-payment loop, performing the entire stealth ceremony (key registration, ECDH derivation, one-time address, scan, withdraw) to move money from their left pocket to their right, publicly, with zero privacy function. 174 of them did the above from an ENS-named wallet; sorry to shame yicheng.eth, rockypanda.eth, tipscoin.eth attempting to pay themselves in stealth. More broadly, 41.5% of all withdrawals land in wallets that are themselves active, visible Umbra senders. The private recipient, more often than not, turns out to be a public one.

WELDING: CONSOLIDATION IS DESTINY

The strongest heuristic in the entire study works on all three protocols, and it is older than blockchains: pay out to the same place, and every "unlinkable" account welds together. You can receive through a hundred one-time addresses, but the moment the money converges to one destination wallet, one funder, or one transaction, the hundred addresses become one person, provably, forever.

Umbra's welds are behavioral. Shared withdrawal destinations plus same-block sweeps (1,102 stealth pairs withdrew in the very same block, against roughly twenty expected by chance, a 55× lift) put 48.3% of active stealth addresses into clusters, the largest spanning 131 addresses.

Cloaked's welds are a feature and arguably good UX. The app invites you to combine stealth accounts in one spend, and every such merge is an onchain proof of common ownership, executed through a public orchestrator and recorded forever. Of the 573 multi-EOA spend transactions, I fully decoded 550: 100% are coherent single-user consolidations. One user merged 51 stealth EOAs in a single transaction, 51 cryptographically pristine one-time addresses, welded into one identity with one click. You can explore the linkage between these stealth addresses here.

One click, one identity

largest single-user merge clusters: stealth EOAs welded together in shared EIP-7702 spends, top 10 per chain

010203040505143#13436#22823#32122#41820#51820#61715#71615#81515#91515#10BaseEthereum
Each bar is one person's cluster of one-time addresses, proven by co-spending. All 573 multi-EOA transactions; 550 fully decoded, 100% coherent single-user consolidations. Explore every edge in Exhibit A below.
One click, one identity — Cloaked merge clusters, one user welding 51 stealth EOAs in a single transaction

Fluidkey's welds are the subtlest, and the most instructive, because they happen at three different moments in a Safe's life:

Conception.

5,026 Safes share a funder, the same personal wallet sent them their first funds, and one wallet seeding many accounts probably means one owner.

The trick is telling users from infrastructure, which I can derive from the number of transactions an address has ever sent. For example, a CEX hot wallet with 478,873 transactions funds thousands of strangers and proves nothing, while a normal wallet with 74 transactions that seeded 836 Safes could only be one operator.

Birth.

1,224 transactions initialized multiple Safes atomically, 3,335 Safes, 10.7% of the census, born pre-linked, sharing their configuration choices 93% of the time.

Death (aka cash-out).

I decoded over 100,000 fund movements out of 27,013 active Safes and found that a naive analysis fake-links 91% of users, because everyone shares the same protocol-internal counterparties (earn vaults, share burns). Excluding those, 6,293 Safes (23.3% of active) consolidate to shared real-wallet destinations.

Combined, conception, birth, and death overlap; deduplicated, they link 12,697 unique Safes of the 28,681 observable.

Three ways a Fluidkey Safe gets welded

Safes linked per edge type, out of 31,263 censused. The weld happens at birth, at the funder, and at the destination

03,0006,0009,00012,000Shared cash-out destination23.3% of active Safes6,293Shared personal-wallet funderCEX hot wallets excluded5,026Born together (atomic co-init)10.7% of the census3,335Union of all three44.3% of observable Safes12,697
Edge types overlap (one Safe can be linked all three ways), hence the union is smaller than the sum. Protocol-internal counterparties (earn vaults, share burns) excluded. Naively counted, they fake-link 91% of users.
Three ways a Fluidkey Safe gets welded — shared funder, atomic co-creation, shared cash-out destination

FINGERPRINTS IN THE AMOUNTS

One of the main use cases for stealth addresses is receiving funds for business without doxxing your entire balance. But, receiving the same amount over and over again can be a fingerprint to cluster addresses.

In Umbra's mainnet history, 455 distinct high-precision wei values repeat exactly across 1,617 payments, 6.9% of the ETH total. The chance of two independent payments colliding on the same 18-digit wei amount is about 2⁻⁶⁰. Every repeat is a proven relationship between payments that share no address.

Then there are the fiat price-point families: a merchant charging a fixed dollar price emits non-round ETH amounts that drift in a tight band with the exchange rate. I found 108 such clusters, with one having 64 payments of 0.0045 spread over 13 months.

There is a poetry to Fluidkey's version. Its users fund their Safes from a personal account, and the remainder after funding, the accounting dust, carries sub-cent suffixes that repeat across Safes. There is a family of 12 Safes, each depositing a specific decimal .552850, rotating weekly, their balances decrementing in exact 9-USDC steps, one entity's whole operation, fingerprinted by its own bookkeeping.

THE NAMING LAYER

Cloaked's usernames are its leak, and they leak through three separate offchain channels.

First, the CCIP gateway is an existence oracle: registered names return a stealth address, unregistered names return zero. Second, the username.clkd.id web app is a second, faster oracle which returns a 200 or 404. Thirdly, Google indexes the receive pages, a single site:clkd.id search surfaces usernames with no probing at all.

You can also brute force the name search. I probed 9,000 dictionary words through both oracles (and promptly gave up), recovering 69 registered usernames like real first names (olivia, candy, alyssa…) and crypto canon (satoshi, nakamoto, wagmi, whale, stealth, private, cloak). Interestingly, one user links their Cloaked username to their personal website next to his full legal name.

You can also build a forward-looking version of this attack. On page visit, a fresh stealth address is created and shown. I visited and harvested 1,475 disposable addresses across 59 known usernames, that can then be put on a watchlist and rechecked for transactions. To be fair to Cloaked, this is a good UX for the biggest use case of stealth addresses, receiving payments to disposable addresses.

THE PANOPTICON

Even where user-to-user privacy holds perfectly, there is always someone watching. Umbra has no operator, just contracts; outsiders are the watchers here. Fluidkey's backend holds viewing-key nodes, and its operational reality is singular, with one submitter EOA, one batcher, and one signing relayer running every auto-earn operation.

Cloaked is custodial-grade, the server holds the child viewing keys, they can see everything, and the Cloaked Safe is visible in both chains' spend graphs. The user-to-user privacy in these systems can be perfect while the user-to-operator privacy is zero. This is a trade users should know they are making for a specific user experience.

STANDARDS VS BESPOKE STACKS

Underneath the three products sits a fork in the road, building using the onchain standards:

  • ERC-5564 - stealth address generation, announcement events, view tags for efficient scanning
  • ERC-6538 - the stealth meta-address registry: your spending and viewing public keys, published once, bound to your wallet by signature

Or creating a bespoke stack, borrowing the elliptic-curve handshake but serving fresh stealth addresses from an offchain gateway instead.

Standards vs Bespoke Stacks

the fork in the road underneath all three products: the published standard vs bespoke offchain gateways

ERC-5564 + ERC-6538 (Umbra)Bespoke gateway stacks (Fluidkey · Cloaked)
Key publicationonchain registry, signed by your wallet, permanentoffchain, derived from a wallet signature, held and served by the backend
Who can enumerate userseveryone; the registry is publicthe operator only; usernames sealed from the chain
Announcementonchain Announcement events with view tags; anyone's wallet can scannone; the gateway hands each sender a fresh address directly
Scanningyour viewing key, client-side, trustlessthe operator scans for you; it holds the viewing key
Receiving accountone-time EOA you withdraw from yourselfFluidkey: counterfactual Safe · Cloaked: one-time EOA upgraded to a 7702 smart account at spend time
Spend pathyou sign from the stealth address; the linking tx is yoursrelayer / orchestrator executes for you; the linking infrastructure is theirs
Trust surfacenone; pure contracts, no operatorcustodial-grade: the server sees everything
Interopany wallet can implement the standard and pay any registrantlocked to the vendor's app and gateway
The trade is symmetric: the standard's strength, anyone can find your keys and pay you without asking a server, is precisely its leak. The stacks sealed enumeration by moving key-serving offchain, and the price is the panopticon.
Standards versus bespoke stacks — the onchain standards path against the offchain gateway path

The trade is brutally symmetric. The ERC-6538 standard's strength, that anyone can find your keys and pay you without asking a server, is precisely its leak. Anyone can enumerate the registrants, forever, and it is even easier when 37% of them registered under their own name.

The bespoke stacks fixed enumeration by moving key-serving offchain, and the price is the panopticon. The gateway that serves your fresh addresses is the same server that watches you spend them.

The standard also shows its age in the spend path: 5564 assumes an EOA receiver who withdraws themselves, which is exactly where the self-payment loops come from. The smart-account era fixed that UX, and every convenience layer it added became an operational fingerprint.

The number that should sober both camps: the standardized trustless design and the custodial bespoke stacks end up with their users linked at roughly the same rates (56–61% for Umbra, 40–61% for Fluidkey and Cloaked) for completely different reasons. The architecture chooses where you leak, and the user decides whether.

SO: HOW MUCH STEALTH DO YOU GET?

You get excellent stealth for incoming payments, and almost none for living your life.

The receive side works. Across 25,000 Umbra payments, 31,000 Fluidkey Safes, and 4,000 Cloaked spenders, I found no protocol leaks. If all you do is receive and hold, you are genuinely unlinkable; about the 8.1% of Umbra users who never withdrew, cannot be identified. The moment money moves, the stealth collapses. 61% of Umbra users who ever withdrew are linked. 61% of Cloaked's Ethereum spenders linked themselves in the very act of spending. 44% of Fluidkey's observable Safes are linked, a tenth of the census before moving a cent.

Umbra is trustless, operator-free, non-custodial, and the only design here with no one to subpoena. Unfortunately, its registry is a permanent identity anchor that 37% of users ENS-doxxed at creation, and self-withdrawal puts the linking transaction in the user's own hands, and usage is declining.

Fluidkey has the strongest receive-side design ever shipped: no onchain registry, sealed usernames, and smart-account UX with real yield. But its proprietary relayer-and-module footprint made its entire user base enumerable in an afternoon, its users weld themselves at destinations and funders, and the backend sees everything.

Cloaked has a pristine receive layer and the smoothest UX of the three, but it is custodial-grade at the server, its usernames leak through oracles, search engines and its own users' websites. Its flagship convenience feature, merging accounts at spend time, is a permanent onchain link. They are also the closest to giving their users more privacy, nudging them to deposit in Privacy Pools, allowing users to withdraw to a new address post stealth address merge.

Stealth addresses are cool, and an effective primitive for solving onchain receiving privacy, but every generation has moved the leaks around as opposed to eliminating them. The core structural challenge across all three protocols remains the spend phase. Once funds arrive at a stealth address, moving or using them without linking them back to a main or common destination remains difficult. We've seen the rise of confidential tokens, FHE, MPC, privacy pools, all of which can be utilised to decouple the stealth address from the ultimate withdrawal or spend address.

GHOSTPAY

An example of this is to combine stealth addresses, Privacy Pools, and a relayer over Tor to create a way to spend the funds privately. To explore this idea, I built a prototype called GhostPay:

  1. Connect your wallet
  2. Generate stealth address
  3. Announce ERC-5564 stealth address via Relayer
  4. Scan blocks for payment received
  5. Sweep to Privacy Pools via Relayer
  6. Withdraw to fresh address using saved note

You can test out the prototype here: ghostpay.ethprivacy.tools or 3cp7ozttq4dygx4xts37rxia7okn634ggw6fzxxtf2dxtx2ixe3fatyd.onion, and review the implementation here https://github.com/unhappyben/ghostpay.

1 ERC-5564: how a payer turns your two public keys into a fresh one-time address, and how your viewing key finds it in the announcements.

2 ERC-6538: where those two public keys live onchain, signed to your wallet, so anyone can pay you without asking.

3 https://arxiv.org/abs/2308.01703

Evaluating stealth addresses but not sure if they fit your product? Talk to Ben.

TALK TO BEN →

FILE UNDER — RESEARCH

NEXT READS

HOW "PRIVATE" IS STARKNET'S BUILT-IN PRIVACY? 113,022 pool events re-indexed: 40.4% of withdrawals certainly linked to their funding deposit HOW PRIVATE IS PRIVACY POOLS? seven heuristics across every v1 transaction: what actually links a withdrawal to its deposit HOW CONFIDENTIAL IS ZAMA'S CONFIDENTIAL VAULT? every public event around the confidential vault: 98.1% of depositors traced at the wrap

DEEP DIVES · RESEARCH · WORK WITH ME