CipherScan
Zcash blockchain explorer. Privacy-first tools.
Created on 1st December 2025
•
CipherScan
Zcash blockchain explorer. Privacy-first tools.
The problem CipherScan solves
When I started building on Zcash, I hit three walls pretty fast.
First, the developer experience was rough. Most block explorers were outdated or had confusing UIs. Worse, there was no comprehensive API I could just plug into. If I wanted transaction data, I'd need to run my own full node and figure out RPC calls myself. For someone new to Zcash, that's a huge barrier to entry.
Second, there was a privacy paradox. Zcash's shielded transactions are brilliant, but how do you actually verify your own transactions without compromising privacy? Every solution I found required sending your viewing keys to a third-party service. You had to choose: trust someone else with your keys, or build the entire decryption stack yourself.
Third, privacy adoption was invisible. I'd look at the blockchain and see most value still sitting in transparent pools. Users didn't understand the impact of their choices. There was no way to visualize privacy adoption, no incentive, no "aha!" moment that would push people toward shielded transactions.
I built CipherScan to fix these problems, starting with the hardest one: client-side memo decryption in the browser.
What CipherScan Does
CipherScan is a block explorer with four core features:
Developer Infrastructure
- Clean REST API + WebSocket feeds for blocks, transactions, addresses, and shielded pool stats
- Public Lightwalletd endpoints for both mainnet and testnet
- Open-source with deployment scripts, you can use our hosted instance or self-host
- Coming soon: NPM package (@cipherscan/zcash-memo-decrypt) for drop-in client-side decryption
Client-Side Memo Decryption
- 342KB WebAssembly module compiled from Zcash's core crypto libraries (orchard, sapling-crypto)
- Supports both Orchard and Sapling pools
- Decrypt single transactions or full wallet history
- Zero-trust: your viewing keys never leave your browser
Privacy Metrics
- Real-time Privacy Score showing % of Zcash value in shielded vs transparent pools
- Historical tracking to visualize adoption trends
- "Learn Zcash" page with wallet guides and developer resources
Cross-Chain ZEC Flows
- Real-time tracking of ZEC swaps via NEAR Intents (BTC, ETH, SOL, NEAR → ZEC)
- Shielded Rate metric: what % of bridged ZEC gets shielded after arrival
- Volume analytics with 24h/7d trends and chain breakdown
Status:
- ✅ Testnet fully operational: https://testnet.cipherscan.app
- ✅ Mainnet fully operational: https://cipherscan.app
- 🔄 ZEC Flows: UI complete with mock data, awaiting NEAR Intents API key for live integration
Challenges I ran into
WebAssembly Memo Decryption - The Hardest Part
Compiling Zcash's cryptographic libraries to WebAssembly for client-side memo decryption had never been done before. No examples, no documentation, just trial and error.
The CompactAction Mystery (1 week lost here)
GOAL: Use Lightwalletd's compact blocks for faster memo decryption.
PROBLEM: try_compact_note_decryption() always returned None, even for transactions I knew were mine. But try_note_decryption() with full transaction hex worked perfectly!
THE BREAKTHROUGH: Lightwalletd returns the full 580-byte ciphertext, but compact decryption needs exactly the first 52 bytes. The docs never mentioned this.
The fix was literally one line: Extract only ciphertext_bytes[0..52] instead of passing the full buffer.
One line. One week to find it.
Version Hell
Zcash crates have breaking API changes between versions with no compatibility matrix:
- orchard 0.9 uses CompactAction::from_parts()
- orchard 0.10 changed the types
- orchard 0.11 removed it entirely
- zcash_note_encryption 0.4 vs 0.5 are incompatible
Days of trial and error to find the right combination.
WASM-Specific Issues
NO FILESYSTEM: Standard Zcash needs 100MB+ proving params from disk. Solution: Only compile decryption code, skip proving entirely.
NO OS RANDOMNESS: WASM can't access /dev/urandom. Solution: Use getrandom with the "js" feature for browser crypto.
The Working Config
Final dependencies that work:
- zcash_primitives 0.15 (default-features = false)
- orchard 0.9.0 (default-features = false, features = ["std"])
- zcash_note_encryption 0.4
- getrandom 0.2 (features = ["js"])
RESULT: 342KB WASM module that decrypts Orchard + Sapling memos in-browser, processes 10K blocks in 2-3 seconds, keys never leave the client.
Other Technical Hurdles
INFRASTRUCTURE: Zebra mainnet indexing took 4+ days (2.5M+ blocks). Building an indexer that keeps up with 75-minute blocks while backfilling required PostgreSQL optimization and batch processing.
PRIVACY METRICS: Defining a meaningful, actionable Privacy Score. Settled on (Shielded Value / Total Value) × 100 with historical trending.
RELIABILITY: Running production Zcash infrastructure (Zebra + Lightwalletd + PostgreSQL) with monitoring, automated restarts, and graceful chain reorg handling.
NEAR INTENTS INTEGRATION: The Explorer API requires JWT authentication with rate limits (1 req/5s). We built the full UI with mock data while awaiting API access, designing for caching and graceful fallbacks when the API is unavailable.
Tracks Applied (6)
Zcash Data & Analytics
Gemini
Privacy Infrastructure & Developer Tools
Zcash Community Grants
Zcash Data & Analytics
Raybot
Privacy Infrastructure & Developer Tools
Raybot
Cross-Chain Privacy Solutions
NEAR Protocol
General Bounty
Project Tachyon
Technologies used
