Rime
A Privacy-hardened UA light client for Zcash.
Created on 3rd December 2025
•
Rime
A Privacy-hardened UA light client for Zcash.
The problem Rime solves
Current zcash light clients leak metadata through multiple vectors - memo fetch patterns, block-range queries, timing differences, and network identifiers which can allow transaction graph reconstruction and timing correlation attacks, revealing which shielded outputs belong to a wallet, even though the underlying zcash transactions are private.
Rime solves this by providing a hardened, unified address light client that reduces these leaks on the client side. PIR, dummy traffic, full-memo retrieval, bucketing, constant-cost trial decryption, tor integration, and stateless/ephemeral modes make common wallet operations safer without requiring changes to consensus or lightwalletd.
Challenges I ran into
- Receive only ufvk derivation (non-standard sapling path): zip 32 assumes spend authority, but rime is receive-only, sapling uses a custom all-hardened path (not zip-32 compatible) while orchard stays standard zip-32. Getting both to yield consistent ivks/ufvks and making trial decryption succeed in practice took careful path selection and validation because theres no clear reference for a receive-only ufvk pipeline.
- PIR from scratch: built xor-pir client/server tooling with fixed-size buckets, two-server query shares, and bucket reconstruction back into valid CompactBlock structures. Ensuring bucket sizing, padding, and xor assembly didnt break witness positions, plus adding a constant-rate dummy scheduler, required several iterations to balance correctness, bandwidth, and sync performance.
- Sync correctness across sapling/orchard: maintaining incremental witnesses/positions for both pools, handling reorgs (reset-to-birthday, block-hash checks), and checkpointing trees every 1000 blocks while keeping SQLite state consistent was a bit complex. Edge cases like replaying history after reorgs and aligning witnesses with block batches needed multiple redesigns.
- Tor circuit isolation with arti: splitting RPC vs PIR isolation groups, jittering connects, and managing separate tor state/cache dirs was under-documented. Making isolation reliable (no state leaks, graceful failure handling) required diving into arti’s behavior and tweaking connection timing and isolation tokens.
Tracks Applied (8)
Self-Custody & Wallet Innovation
Osmosis
Private Payments & Transactions
Osmosis
Privacy Infrastructure & Developer Tools
Zcash Community Grants
Self-Custody & Wallet Innovation
Unstoppable Wallet
Privacy Infrastructure & Developer Tools
Raybot
Generic Bounty
Mintlify
General Bounty
Project Tachyon
Private Payments & Transactions
Star Fun
Technologies used