Zecd: The zcashd wallet alternative by Zec.rocks

Hello all!

Zec.rocks is excited to introduce zecd: a zcashd wallet alternative built for scale.

We created zecd to power Overpay.com. When zcashd deprecation got accelerated, we decided to open source it to enable serious Zcash integrators to migrate away from zcashd without delay.

Its design is informed by our unique experience with scaling the Zec.rocks global Zcash infrastructure to support millions of wallet requests per day.

It’s free, open source, and will stay maintained: Source, Documentation

And it’s ready! Get zcashd out of your stack today. We use zecd in production to power our business, and we think you’re going to love its usability.

Simple, Secure, and Familiar

Zecd strives for simplicity through an opinionated design:

  1. It speaks bitcoind, not zcashd. Method names, response shapes, auth, and error codes follow Bitcoin Core for developer familiarity, with a few z_* methods for convenience when shielded semantics demand them.
  2. Direct zebra communication. zecd is built on the proven foundation of librustzcash with one simplification: it connects directly to a self-hosted Zebra node over JSON-RPC. No lightwalletd, no P2P, no chain index of its own.
  3. A fresh start. Zecd is intentionally not backwards-compatible with zcashd’s RPC or wallet.dat. The only supported migration path from zcashd is sending funds on-chain to a zecd address. It is seed-compatible with other librustzcash wallets, for wide compatibility.
  4. It’s stateless. Everything is recoverable from the wallet seed: no wallet.dat, no keypool. The data directory is a disposable cache, init --restore from the mnemonic rebuilds everything. (Shielded funds unconditionally; transparent within the configured gap limit.)
  5. One account, with diversified addresses. This enables lightning-fast sync and predictable wallet recovery. Only account 0 is used; getnewaddress hands out fresh diversified Unified Addresses of that account.
  6. It’s built by Zec.rocks, so it’s cloud-native. Health/readiness probes, structured JSON logs, secrets via env vars or mounted files, reproducible StageX container builds, and easy horizontal scaling ergonomics - informed by our experience scaling Zec.rocks to millions of daily requests.

Learn more in our documentation: https://zecd.org

Quick start (Docker)

The repo ships a compose stack that runs the full zebra+zecd pipeline (testnet by default):

git clone https://github.com/zecrocks/zecd && cd zecd/deploy
docker compose up -d zebra                   # start the node, let it sync
docker compose run --rm zecd init            # generate seed + create the wallet
docker compose up -d                         # start zecd
curl localhost:9233/readyz                   # readiness probe
curl --user zec:CHANGE-ME --data-binary \
  '{"method":"getblockchaininfo","id":1}' localhost:18232/

For mainnet, add -f docker-compose.mainnet.yml to each compose command (and set a real RPC password first, by editing zecd.toml).

(extract our Zebra testnet snapshot if you’re not feeling like a long sync time)

Quick start (without Docker)

You need a local zebrad with RPC enabled, and Rust installed. In zebrad.toml:

[network]
network = "Testnet"

[rpc]
listen_addr = "127.0.0.1:18234"

Then build and run zecd from source:

git clone https://github.com/zecrocks/zecd && cd zecd

# 1. Initialize a testnet wallet (generates a 24-word mnemonic)
cargo run --release -- --datadir ./data --testnet init

# 2. Run the daemon (syncs in the background, serves JSON-RPC)
cargo run --release -- --datadir ./data --testnet \
    --rpcuser zec --rpcpassword secret --rpcbind 127.0.0.1 --rpcport 18232

And talk to it exactly like bitcoind:

from bitcoinrpc.authproxy import AuthServiceProxy
rpc = AuthServiceProxy("http://zec:secret@127.0.0.1:18232")
print(rpc.getblockchaininfo())
addr = rpc.getnewaddress()        # a fresh u1... Orchard Unified Address
print(rpc.getbalance())

Why we built zecd

While working on Overpay.com we got frustrated with the state of server-side Zcash wallets and decided to build our own rather than wait out the deprecation.

We began using an early version of zecd in production in January. When the zcashd deprecation deadline got urgently rescheduled a few weeks ago, it pushed us to clean up and open source zecd as soon as possible (and to begrudgingly add inbound t-address support).

Zecd was only made possible by the troves of proven code built by the librustzcash, zcash-devtool, Zebra, Zallet, and Zaino teams, and tested by everyone who uses them. Thank you!

If you already run zcashd and badly need backwards compatibility, wait for a stable Zallet release. If you’re just starting to accept Zcash, or want to leave zcashd sooner than later, we encourage you to try out zecd.

ZEC rocks!

5 Likes

The direct to Zebra path with no lightwalletd looks like the cleanest way off zcashd for server side integrators. For a processor taking many payments into account 0, does the diversified UA model keep invoice to payment mapping clean at scale, or would you still reach for separate wallets?

Yes. Zecd enables customers to pay into a new UA each time, or for integrators to generate UAs with exact diversifiers, helpful to privately store small bits of information in an address, like a user ID or invoice number.

Each payment appears in listtransactions with the exact receiver/address paid into, including the diversifier, so payment mapping is clean.

Another benefit to diversified addresses is that they can be generated offline without any connection to zecd. Diversifiers are a great Zcash feature. Connectivity is only needed to verify that a payment was received.

More information on our approach to addresses: