I’ve been thinking more lately about the privacy trade-offs with t-addresses. I wanted to share my idea, and see if anyone can poke any holes in it.
First, for context, here’s the problem I’m trying to solve:
Currently, major zcash wallets do not rotate t-addresses. There’s valid reasons why wallets do not rotate t-addresses, but t-address reuse is still highly undesirable.
The leading candidate to avoid t-address reuse(afaict) is to use ephemerally generated t-addresses. I’m concerned about risk of loss, however, as users receive money to ephemeral keys they no longer have access to. If the user gives out a t-address, but then changes wallets or loses their phone, etc, then any money sent to that address will not be recoverable by their wallet recovery phrase. This is a small risk, but I think it will happen more than you might expect… Users are likely to bookmark a t-address for reuse, without realizing its ephemeral or what the consequences of an ephemeral address are. Educating normies about the consequences of ephemeral addresses will be a challenge (to put it gently
).
Ok, so my idea:
The problem really has to do with the way HD wallets sync. An HD wallet derives 20 addresses (or whatever you’ve configured for the gap limit) and queries the RPC to see if any address has been used. If so, it derives the next 20 addresses and checks again, until having discovered every address which has been used. It then downloada the UTXOs these addresses own, so that it can construct new transactions that spend those UTXOs. As mentioned before, this will expose to the RPC that you own all of the requested addresses… a very bad privacy leak.
But we don’t have to scan this way. We could download the entire t-addr UTXO set, locally derive the first 10k addresses (or some reasonably large number) and just scan the UTXO set for any of these addresses.
Obviously this has some performance tradeoffs:
- a few GB download of UTXO set
- <1MB of memory for 10k address derivations
- time to deriving address and search the UTXO set (even an old phone can likely do this in <60 seconds)
- user can only receive 10k transactions, lol
IMO the initialization time is acceptable, because its a one-time cost and not meaningfully different from the initialization time already required for syncing shielded outputs.
There’s also some work to be done syncing updates to the UTXO set, but this is doable.
Conclusion
Unless I’m missing something, I believe this would give us the best of both worlds: Deterministic wallets (no risk of loss of funds to ephemeral addresses) without revealing addresses to a wallet RPC.
Curious to hear what others think.