The Problem
On most blockchains, addresses are public. If you share your address to receive a payment, anyone can see every transaction you’ve received, track your total balance, and link your identity to all your financial activity.The Solution: Stealth Addresses
Instead of receiving payments at a single reusable address, each payment goes to a fresh one-time address that only you can detect and spend from.Key Concepts
Stealth Meta-Address
A stealth meta-address is what you publish or share. It contains two public keys:- Spending public key — used to derive stealth addresses. The private key lets you spend.
- Viewing public key — used to detect incoming payments. The private key lets you scan.
How a Payment Works
- Generates a random ephemeral key pair
(r, R) - Computes a shared secret
S = r * viewingPubKey(ECDH) - Hashes the secret:
h = hash(S) - Computes stealth address =
spendingPubKey + h * G - Sends funds to the stealth address
- Publishes announcement:
(R, viewTag)
R and a view tag. This is public, but reveals nothing about who the recipient is.
Step 3: Recipient scans for payments
- Compute shared secret
S = viewingKey * R(same ECDH, other side) - Check view tag — if it doesn’t match, skip (rejects ~255/256 non-matches)
- Compute expected address =
spendingPubKey + hash(S) * G - If expected address matches announced address, it’s yours
stealthPrivateKey = spendingKey + hash(sharedSecret) mod n
View Tags: Fast Filtering
Without view tags, scanning requires a full ECDH computation + point addition for every announcement. View tags add a 1-byte shortcut:EVM vs. Stellar
The same concept works on both chains, adapted to their cryptographic primitives:| Step | EVM (secp256k1) | Stellar (ed25519) |
|---|---|---|
| Key derivation | keccak256(r), keccak256(s) of wallet sig | SHA-256("wraith:spending:" || sig) |
| ECDH | secp256k1.getSharedSecret | X25519 (Montgomery form) |
| Hash to scalar | keccak256(S) mod n | SHA-256("wraith:scalar:" || S) mod L |
| View tag | keccak256(S)[0] | SHA-256("wraith:tag:" || S)[0] |
| Address format | 0x... (20 bytes) | G... (56 chars) |
| Signing | secp256k1 ECDSA | ed25519 with raw scalar |
Standards
EVM stealth addresses are based on:- ERC-5564 — Stealth Address Messenger (announcement format)
- ERC-6538 — Stealth Meta-Address Registry (meta-address storage)
- WraithNames — human-readable
.wraithname to meta-address mapping - WraithSender — atomic send + announce in one transaction
- WraithWithdrawer — gas-sponsored withdrawals via EIP-7702

