Immagina di avere dei “contanti digitali” che dovrebbero essere privati come le banconote vere: nessuno sa chi le ha spese o da dove vengono.
Questo è (in teoria) Cashu: un sistema semplice e veloce per pagare in Bitcoin o Lightning senza lasciare tracce.
L’articolo che stiamo spiegando dimostra invece che questa privacy è fragile.
Se il server che emette i tuoi “contanti digitali” (chiamato mint) è gestito da qualcuno di cattiva fede, può collegare ogni tuo token alla tua wallet.
In pratica, il mint riesce a dire: “questo token da 64 satoshi è stato creato dalla wallet X e ora lo sta spendendo la wallet Y”.
Non servono hacker complessi: basta sfruttare due cose banali che già esistono nei browser (l’ETag e l’ID del “set di chiavi”).
In poche parole: Cashu è anonimo solo se ti fidi ciecamente del mint.
Se non ti fidi, puoi essere tracciato.
E l’autore lo ha provato davvero, usando il wallet cashu.me sul suo computer.
Cos’è Cashu, spiegato come a un bambino di 12 anni
Cashu funziona così:
- Vai al mint (un sito web).
- Gli mandi i soldi veri (Bitcoin/Lightning).
- Lui ti dà dei “biglietti” digitali (i token) firmati crittograficamente.
- Questi biglietti puoi spenderli, scambiarli o riscattarli senza che il mint sappia cosa stai facendo… in teoria.
Il trucco magico si chiama firma cieca (Chaumian blind signature): quando crei il token, lo “nascondi” al mint con la matematica. Il mint firma senza vedere il numero di serie. Sembra perfetto.
Ora entriamo un po’ più nel tecnico (livello intermedio)
Ogni token Cashu è fatto di prove (proofs). Ogni prova contiene:
- l’importo (es. 64 satoshi)
- un “segreto” (il numero di serie nascosto)
- un campo importantissimo: “id” → l’ID del keyset
Il keyset è un gruppo di chiavi pubbliche che il mint usa per firmare i token di certi tagli (1, 2, 4, 8, 16… satoshi). Ogni keyset ha un ID unico, tipo 009d68d193ea3415.
Fin qui tutto normale. Il problema nasce quando il mint decide di essere malizioso.
Il trucco della de-anonimizzazione (ora entriamo nei dettagli tecnici)
L’articolo mostra un mint malizioso scritto in Cloudflare Workers. Ecco esattamente cosa fa:
- Al primo accesso il server ti assegna un walletId segreto e lo mette nell’header HTTP ETag:
- http
ETag: “6x10xf7xqvnsaohlctujd”
- Cache-Control: private, max-age=31536000 Il browser (Chrome, Firefox, ecc.) memorizza questo ETag e lo rimanda indietro ogni volta che parla con quel mint. È come un braccialetto invisibile.
- Il mint collega questo walletId a un keyset e lo salva in una tabella KV:
- js
// quando crea un nuovo keyset
- await KV.put
keyset:${kid}, JSON.stringify({ walletId })); - Ogni volta che fai uno swap o un melt, il mint guarda i token che gli mandi. Ogni token ha dentro l’id del keyset con cui è stato creato. Il mint confronta:
- il keyset del token che stai spendendo
- il walletId della persona che sta facendo la richiesta (dall’ETag)
Se non coincidono, il mint scrive nei log:
[MALICIOUS] Wallet 6x10xf7xqvnsaohlctujd sta spendendo token creati da 9o3ztcs8nfcnbt59ejl0u (Keyset: 009d68d193ea3415)
Ecco! Ha appena collegato due wallet diverse.
Cosa succede se il browser non manda l’ETag? (caso POST)
I browser moderni a volte tolgono l’ETag nelle richieste POST. Il mint malizioso ha un piano B:
- prende IP + User-Agent
- fa un hash
- crea una chiave di sincronizzazione sync_v4:hash(ip+ua)
- se arriva un ETag, lo salva e lo associa.
In pratica riesce a tracciare anche cambiando browser sullo stesso computer.
Esempio concreto di token (così lo vedi davvero)
Ecco un pezzetto di un token Cashu (formato stringa):
cashuAeyJ0b2tlbiI6W3sibWludCI6Imh0dHBzOi8vbWFsaWNpb3VzLW1pbnQ…
“proofs”:[{
“secret”: “b09cfa145afe829d…”,
“C”: “03205eb432ae29786f1eba43ef3b19549a97c32806e554105c9300b60873340651”,
“amount”: 64,
“id”: “009d68d193ea3415” ← questo è il “braccialetto”!
}]
Quel campo id è pubblico e visibile a chiunque guardi il token. Il mint sa a chi appartiene quel keyset.
Perché funziona anche con più dispositivi
L’autore ha provato sullo stesso PC con Chrome e Firefox: il mint ha capito che erano la stessa persona grazie a IP + User-Agent o all’ETag persistente.
Cosa può fare ancora un mint cattivo (segnali extra)
Oltre a keyset + ETag, può usare:
- denominazioni uniche (hai chiesto solo token da 64 sat?)
- timestamp di scadenza
- commissioni particolari
- lock P2PK
- correlazione temporale delle richieste
Come difendersi (consigli pratici dell’articolo)
- Il wallet deve ignorare gli header ETag, Last-Modified, ecc.
- Usa sempre Tor (così IP e User-Agent cambiano).
- Verifica i keyset tramite canali pubblici (Nostr, ecc.).
- Preferisci wallet che non usano il browser (app mobile o desktop con caching disabilitato).
Conclusione
L’articolo di floppy (pubblicato il 22 marzo 2026) non dice che Cashu è inutile. Dice solo la verità scomoda: l’anonimato totale esiste solo se il mint è onesto. Se il mint è sotto controllo di un governo, di un exchange o di un attaccante, i tuoi token diventano tracciabili con una semplicità imbarazzante.
Il codice dimostrativo è pubblico su GitLab (https://gitlab.com/1440000bytes/keytag) e può essere riprodotto in pochi minuti su Cloudflare Workers.
Quindi, la prossima volta che usi Cashu, ricorda: stai usando un sistema bellissimo… ma stai comunque dando fiducia a un server centrale. E quella fiducia può essere tradita con due header HTTP e un campo “id” dentro il token.
Privacy vera? Solo se il mint è tuo… o se segui i consigli di difesa sopra.
https://uncensoredtech.substack.com/p/de-anonymize-cashu-transactions