A 40-hour, 8-week program across 4 progressive stages — from blockchain fundamentals to shipping production apps on the Zcash network. Hands-on labs, real mainnet deployment, open-source contribution.
Public endpoints and tools. You don't need to join the cohort to use them — this is the Zcash developer commons. Sync is already done for you.
Full Zcash Foundation node with synced chain, ready for RPC queries. Block height and Orchard pool balance updated in real time.
Testnet node for safe experimentation. Use this for all labs. Pairs
with lightwalletd at
testnet.zec.rocks:443.
Lightwalletd-compatible gRPC endpoint for wallet operations: compact block streaming, transaction broadcast, address queries. Compatible with all Zingolib and Wallet SDK integrations.
Testnet ZEC (TAZ) faucet. Rate limited to prevent abuse.
Supports transparent and Unified Addresses.
See zechub.wiki/using-zcash/testnet for current faucet URLs.
GitHub Codespace with zebrad + lightwalletd + Zingolib pre-installed. Spin up a full dev environment in under 60 seconds — no local setup required.
Track your progress through the curriculum. Submit labs, get peer and mentor reviews, showcase shipped projects. Verifiable on-chain certificates.
Run the full Zcash developer stack on your own machine. Copy, paste, ship.
# Run the official Zebra node (Zcash Foundation) # Docs: https://zebra.zfnd.org docker run -d \ --name zebra \ -p 8232:8232 \ -p 8233:8233 \ -v zebrad-cache:/home/zebra/.cache/zebra \ zfnd/zebra:latest # Follow sync progress docker logs -f zebra # ⚠ Initial sync downloads ~250 GB — use testnet for development # For testnet: add -e ZEBRA_NETWORK=testnet and use port 18232/18233 # Once synced — install lightwalletd (Zaino gRPC compatible) git clone https://github.com/zcash/lightwalletd.git cd lightwalletd && go build && make install # Connect lightwalletd to Zebra lightwalletd \ --zcash-conf-path ~/.config/zcash.conf \ --data-dir ~/.cache/lightwalletd \ --no-tls-very-insecure # Your gRPC endpoint is now live at localhost:9067 # Get TAZ: https://zechub.wiki/using-zcash/testnet
// Cargo.toml [dependencies] zingolib = "*" // ZODL · github.com/zodl-inc/zingolib tokio = { version = "1", features = ["full"] } // src/main.rs — connect, sync, get balance use zingolib::config::load_clientconfig; use zingolib::lightclient::LightClient; use zingolib::wallet::WalletBase; async fn main() -> anyhow::Result<()> { // Connect to your lightwalletd/Zaino endpoint let cfg = load_clientconfig( "http://localhost:9067".to_string(), None, zingolib::config::Network::TestNet, true, )?; // Create a new wallet (or restore from seed) let client = LightClient::create_from_wallet_base( WalletBase::MnemonicPhrase("your twelve word seed phrase here".to_string()), &cfg, 0, false, ).await?; // Sync the wallet (scans compact blocks) client.do_sync(true).await?; // Print balance println!("{}", client.do_balance().await); // Get your Unified Address println!("{}", client.do_addresses().await); Ok(()) }
// Install grpc-js for lightwalletd / Zaino npm install @grpc/grpc-js @grpc/proto-loader // get-block.ts — query chain tip via lightwalletd gRPC import * as grpc from '@grpc/grpc-js'; import * as protoLoader from '@grpc/proto-loader'; const pkgDef = protoLoader.loadSync('lightwalletd/walletrpc/compact_formats.proto'); const proto = grpc.loadPackageDefinition(pkgDef) as any; const client = new proto.cash.z.wallet.sdk.rpc.CompactTxStreamer( 'localhost:9067', grpc.credentials.createInsecure() // use SSL in production ); // Get the latest block height client.GetLatestBlock({}, (err: Error, resp: any) => { if (err) return console.error(err); console.log('Chain tip:', resp.height, resp.hash?.toString('hex')); }); // Stream compact blocks for wallet scanning const stream = client.GetCompactBlocks({ start: { height: 2500000 }, // wallet birthday end: { height: 0 }, // 0 = chain tip }); stream.on('data', (block: any) => console.log('block:', block.height)); stream.on('end', () => console.log('Scan complete'));
# Install grpcio for lightwalletd / Zaino pip install grpcio grpcio-tools # Generate Python stubs from the lightwalletd proto files git clone https://github.com/zcash/lightwalletd.git python -m grpc_tools.protoc \ -I lightwalletd/walletrpc \ --python_out=. \ --grpc_python_out=. \ lightwalletd/walletrpc/service.proto # query_chain.py — get chain tip import grpc import service_pb2, service_pb2_grpc # Connect to your lightwalletd / Zaino endpoint channel = grpc.insecure_channel("localhost:9067") stub = service_pb2_grpc.CompactTxStreamerStub(channel) # Get latest block height tip = stub.GetLatestBlock(service_pb2.ChainSpec()) print(f"Chain tip: {tip.height}") # Broadcast a raw signed transaction # tx_bytes = ... (construct with Zingolib or wallet SDK) # result = stub.SendTransaction(service_pb2.RawTransaction(data=tx_bytes)) # print(f"txid: {result.errorCode} {result.errorMessage}")
Completion requires three tangible outputs — not a certificate of attendance. This is what makes a Zcash developer.
Your own wallet UI, payment gateway, or shielded tool — deployed with real value. Minimum $5 in ZEC transacted. No simulators. No tutorials. Real users welcome.
Written documentation of what you built and why, with code walkthroughs. Published on your own channel or on the builders.z.cash blog. Becomes part of the permanent Zcash learning corpus.
A pull request in an official Zcash repository — Zebra, Zaino, zcash-wallet-sdk, zallet, or zcash-migrate. Reviewed by maintainers. Merged or under active review by demo day.
Everything you need to know before applying to the Zcash Builders program.