Zchat
Shielded Zcash tx as your privacy-chat layer
The problem Zchat solves
Most people in crypto talk about privacy, but their actual conversations still live on centralized servers: Discord, Telegram, Slack, email. Those tools:
- Leak metadata (who talks to whom, when, how often)
- Rely on third-party servers and login providers
- Don’t integrate natively with funds or on-chain actions
On the Zcash side, shielded memos already exist, but they’re stuck inside wallet UIs as “advanced transaction fields”, not as a first-class messaging experience. There’s no simple way for two Zcash users to DM each other, coordinate, or negotiate over ZEC while keeping both value and conversation private.
Zchat (Zsend.xyz) turns shielded Zcash memos into a familiar chat experience:
- Each message is a tiny shielded transaction with a memo.
- Our full node + lightwalletd see the chain; the backend + frontend render it as a chat.
- Contacts are Zcash unified addresses or chosen usernames.
People can use it to:
- Coordinate OTC trades and over-the-counter deals privately, with funds and chat in the same place.
- Run private DAO / multisig coordination where every instruction is on-chain and encrypted.
- Provide private support or consulting, where invoices + messages live inside ZEC transactions.
- Regular chatting.
Communicate in high-risk environments where both payment metadata and chat metadata must stay shielded.
It makes existing tasks safer by:
- Removing the trusted chat server – only your own node + wallet infra see your data.
- Reducing metadata leakage: a third party only sees shielded ZEC flows, not message contents.
- Giving a clean UX: users get Signal-style chat, but everything settles on Zcash.
In short: Zchat is a ZEC-native messenger that lets people talk and pay over the same private channel, secured by Zcash instead of web2 infrastructure.
Challenges I ran into
I wired a full end-to-end stack: zebrad → lightwalletd → Rust wallet core → Node backend → Next.js frontend. No Mocks. A few things were surprisingly hard:
- Getting lightwalletd + zebrad playing nicely
- I run zebrad as my mainnet full node and compiled lightwalletd from source.
- The first attempts failed with mysterious errors like open db/main/blocks: permission denied and GetBlockRange: must specify start and end heights.
Fixes:
- Cleaned up and re-owned the db/ directory (root vs normal user confusion).
- Pointed lightwalletd at the correct zcash.conf and RPC creds.
- Verified connectivity with grpcurl to ensure the CompactTxStreamer service was live.
- Proto and API mismatches in Rust wallet core
I’m using zcash_client_backend + zcash_protos and generating gRPC types locally.
The proto schema and the Rust client expectations were slightly out of sync:
- BlockID vs BlockId
- Different nesting (start_height vs start.height)
A nasty error: invalid wire type: LengthDelimited (expected Varint) when decoding CompactBlock.
Fixes:
- Regenerated the proto types to match lightwalletd’s exact version.
- Adjusted the sync logic to construct the right BlockRange structure.
- Added a debug-sync and debug-notes CLI commands to introspect wallet state while iterating.
- Turning a Rust wallet into a reusable service
I refactored a single-purpose Rust crate into a library + CLI:
- WalletCore struct with methods like init, sync, get_balance, send, list_messages.
- A zchat-wallet binary that outputs machine-readable JSON for the backend.
Fixes:
- Cleaned up visibility modifiers (pub everywhere needed, private elsewhere).
- Introduced a thin abstraction so the Node.js backend can treat the wallet as a subprocess “RPC” without knowing Rust.
Overall, the main challenge was stitching full-node infrastructure to a consumer-grade chat UX under hackathon time pressure, while debugging low-level gRPC + protobuf issues along the way.
Tracks Applied (6)
Privacy Infrastructure & Developer Tools
Starknet
Privacy-Focused Content & Media
Mina Protocol
Privacy-Focused Content & Media
Aztec
Private Focused Content & Media
Osmosis
Creative Privacy Applications
Fhenix
Privacy-Focused Content & Media
Bitlux
Technologies used
Cheer Project
Cheering for a project means supporting a project you like with as little as 0.0025 ETH. Right now, you can Cheer using ETH on Arbitrum, Optimism and Base.
