Zec.rocks Workshop: Host a Light Wallet Server

Hey folks, as a friend of @emersonian, I’m ready to help get this workshop running. We’ve been working in the background for awhile, collaborating to make sure it’s ready for this workshop.

**Launching Thursday August 28, 2025. **

Link to forum: https://workshops.zec.rocks/

Key features:

  • All course materials will be published for a go-at-your-own-pace style of learning
  • The workshop will be hosted in a separate forum to keep things focused. @Emersonian and I will be active in answering questions
  • It’s for real happening this time

Thanks for your patience, I’m excited to get started.

Sincerely,

ReadyMouse
Ready for Adventure, Cheese, and a Zcash Validator Node Workshop

10 Likes

Excited! Thank you for taking this on @readymouse .

2 Likes

Fantastic! Looking forward to getting this running. :flexed_biceps:

4 Likes

Hello all! The workshop is ready to kick-off, the forum is live and the documentation is ready for folks.

Workshop forum: https://workshops.zec.rocks/
Class documentation: zcash-stack/docs at main · zecrocks/zcash-stack · GitHub

6 Likes

Hey @readymouse , great initiative.

I’ve read zcash-stack/docs/class-1-sync.md at main · zecrocks/zcash-stack · GitHub and the rest of the workshop docs, pretty good to get anyone started. However, I cannot find any recent/updated resources on the hardware requirements for the node, other than ~400 GB disk space and good internet connection. I wonder if there are any CPU/RAM requirements for home lab, and also for the disk any SSD/etc requirements.

To make the question simpler, I wonder if I can run Zcash full node on a Raspberry Pi 5 16GB (Broadcom BCM2712 quad-core Arm Cortex A76 processor @ 2.4GHz)?

1 Like

Yes!

I’m using the 8GB version and it works fine, but I would opt for the 16GB , 1TB SSD now If i was shopping

1 Like

Perfect, thank you. I already have a 16GB with 1TB SSD that I purchased for some home automation but it’s using only 1% of the resources, so I’m thinking of booting up a zcash node.
How’s the bandwidth usage?

p.s. I stared a chatgpt deep research session to compare the implementations and their hardware requirements. I can share the info on this forum if you think it’d be useful for future lost souls :slight_smile:

1 Like

I realized none of the docker images are built for ARM :confused:

: Provide ARM builds of all zcash-stack software · Issue #10 · zecrocks/zcash-stack · GitHub

1 Like

Unknown, I am not monitoring :slight_smile: Thanks again for running your node!

Yeah, I compile from source anywayz

1 Like

Good catch! I’m working on pushing ARM builds up to Docker Hub soon, will let you know when they are available.

Until then, building from source is the best option. We are working on a guide on how to do that, I’ll update you here when both are ready. Thanks for participating in the workshop!

3 Likes

Here is a docker compose file which will work with ARM devices like the Raspberry Pi, Apple Silicon chips, and AWS Graviton processors.

A crash course on how to use it:

git clone https://github.com/zecrocks/zcash-stack.git
cd docker

# Optionally download a blockchain snapshot to save days of syncing:
./download-snapshot.sh

# Run Zebra + Lightwalletd:
docker compose -f docker-compose.arm.yml up -d

# To watch the logs: (control+c to quit watching)
docker compose logs -f

I’ll get this build into a CI pipeline at some point, but for now these images may help you meet the September 15th deadline for the first payout!

2 Likes

Great, thank you.

Just trying this and getting this error and trying to debug. if you know where to look plz lmk

```
[+] Running 0/1
[+] Running 1/3er_default Creating 0.2s
[+] Running 4/4er_default Created 0.3s
:check_mark: Network docker_default Created 0.3s
✘ Container docker-zebra-1 Error 2.9s
:check_mark: Container docker-watchtower-1 Started 2.2s
:check_mark: Container docker-lightwalletd-1 Created 0.6s
dependency failed to start: container docker-zebra-1 is unhealthy
```

Still debugging. This is the error I get in the docker logs

   :zebra-1       | 2025-09-13T01:07:46.518555Z  INFO zebrad::application: Using config file at: “/etc/zebrad/zebrad.toml”zebra-1       | 2025-09-13T01:07:46.518560Z  INFO zebrad::application: ZebradConfig { consensus: Config { checkpoint_sync: true }, metrics: Config { endpoint_addr: None }, network: Config { listen_addr: 0.0.0.0:8233, external_addr: None, network: Mainnet, initial_mainnet_peers: {“dnsseed.z.cash:8233”, “dnsseed.str4d.xyz:8233”, “mainnet.seeder.zfnd.org:8233”, “mainnet.is.yolo.money:8233”}, initial_testnet_peers: {“dnsseed.testnet.z.cash:18233”, “testnet.seeder.zfnd.org:18233”, “testnet.is.yolo.money:18233”}, cache_dir: IsEnabled(true), peerset_initial_target_size: 25, crawl_new_peer_interval: 61s, max_connections_per_ip: 1 }, state: Config { cache_dir: “/var/cache/zebrad-cache”, ephemeral: false, delete_old_database: true, debug_stop_at_height: None, debug_validity_check_interval: None }, tracing: Config { inner: InnerConfig { use_color: false, force_use_color: false, filter: None, buffer_limit: 128000, endpoint_addr: None, flamegraph: None, progress_bar: None, log_file: None, use_journald: false } }, sync: Config { download_concurrency_limit: 50, checkpoint_verify_concurrency_limit: 1000, full_verify_concurrency_limit: 20, parallel_cpu_threads: 0 }, mempool: Config { tx_cost_limit: 80000000, eviction_memory_time: 3600s, debug_enable_at_height: None }, rpc: Config { listen_addr: Some(0.0.0.0:8232), indexer_listen_addr: None, parallel_cpu_threads: 0, debug_force_finished_sync: false, cookie_dir: “/home/zebra/.cache/zebra”, enable_cookie_auth: false }, mining: Config { miner_address: None, extra_coinbase_data: None, internal_miner: false } }zebra-1       | 2025-09-13T01:07:46.518648Z  INFO {zebrad=“” net=“Main”}: zebrad::application: initialized rayon thread pool for CPU-bound tasks num_threads=4zebra-1       | 2025-09-13T01:07:46.519014Z  INFO {zebrad=“” net=“Main”}: zebrad::commands::start: Starting zebradzebra-1       | 2025-09-13T01:07:46.519079Z  INFO {zebrad=“” net=“Main”}: zebrad::commands::start: initializing node statezebra-1       | 2025-09-13T01:07:46.525614Z  INFO {zebrad=“” net=“Main”}: zebrad::commands::start: opening database, this may take a few minuteszebra-1       | 2025-09-13T01:07:46.540137Z  WARN zebra_state::service::finalized_state::disk_db: could not create new directory for state cache at “/var/cache/zebrad-cache/state/v27/mainnet”: Permission denied (os error 13)zebra-1       | 2025-09-13T01:07:46.540195Z  INFO zebra_state::service::finalized_state::disk_format::upgrade: creating new database with the current format running_version=27.0.0zebra-1       | The application panicked (crashed).zebra-1       | Message:  Opening database “/var/cache/zebrad-cache/state/v27/mainnet” failed. Hint: Try changing the state cache_dir in the Zebra config. Error: Failed to create RocksDB directory: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }.zebra-1       | Location: zebra-state/src/service/finalized_state/disk_db.rs:947zebra-1       |zebra-1       | Diagnostic metadata:zebra-1       | version: 2.5.0zebra-1       | Zcash network: Mainnetzebra-1       | running state version: 27.0.0zebra-1       | initial disk state version: creating.new.databasezebra-1       | features: default,default_release_binaries,howudoin,indicatif,metrics_exporter_prometheus,progress_bar,prometheus,release_max_level_info,sentryzebra-1       | branch: VERGEN_IDEMPOTENT_OUTPUTzebra-1       | git commit:zebra-1       | commit timestamp: VERGEN_IDEMPOTENT_OUTPUTzebra-1       | target triple: aarch64-unknown-linux-gnuzebra-1       | rust compiler: 1.85.0zebra-1       | rust release date: 2025-02-17zebra-1       | optimization level: 3zebra-1       | debug checks: falsezebra-1       |zebra-1       | Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.zebra-1       | Run with RUST_BACKTRACE=full to include source snippets.

But the folder I hav after the download-snapshot is : data/zebrad-cache/state/v26/mainnet/

So possible issue with v26 vs v27?

Assuming your paths are correct in the conf (one says var/cache and the other says data/zebrad-cache) I would guess it’s a permissions issue with docker being sandboxed and not being able to create or possibly use your local directory which is normal pretty much.

WARN zebra_state::service::finalized_state::disk_db: could not create new directory for state cache at “/var/cache/zebrad-cache/state/v27/mainnet”: Permission denied (os error 13)zebra-1

1 Like

thank you.

I’m not sure exactly what was the main issue, but redid all the permissions and changed some docker volume settings and it seems to work now.

lesson learned so far: do not delete all the blockchain data due to a permission issue. :man_facepalming: downloading the snapshot again, i’ll report back.

1 Like

Finally got mine running and synced. Based on docker logs the donation address is being announced by my node.

however, after hours of trying, I’ve exhausted my ideas on how to attach a public domain to the node (running at home), ideally with some privacy (prevent ip leak). Any guidelines to follow for this step?

Update: Cloudflared tunnel was my main idea, but it seems they don’t support gRPC though http, so I doubt it will work.

I used IONOs they support http.

1 Like

Thank you.
I ended up using a reverse ssh tunnel to a vps, took a while but seems to be working on my mobile Zashi wallet.

Added a PR with the configs and docs to the workshop repo for the next lost souls :slight_smile: : Add VPS Proxy Setup docs and docker config files by shayanb · Pull Request #18 · zecrocks/zcash-stack · GitHub

2 Likes

I’m just now seen this learning C++ and this is something else lets go.

Hi,
I am following the workshop to setup a lightwalletd service and am running into below issue.

I have downloaded snapshot using download-snapshot.sh which i am not sure if it completed or failed in between as it ended with below logs.

zebra-2025-09-12/state/v27/mainnet/027093.sst

zebra-2025-09-12/state/v27/mainnet/026398.sst

zebra-2025-09-12/state/v27/mainnet/012861.sst

tar: state/v27: Cannot utime: Operation not permitted

tar: Exiting with failure status due to previous errors

Snapshot download finished.

I went ahead and ran docker compose up -d and ran into the below error, not sure if both are linked or not. I don’t want download complete snapshot again from scratch. Would appreciate help with this.

zebra-1  | 2025-11-17T05:26:47.146653Z  INFO {zebrad="d1a3c74" net="Main"}:sync:try_to_sync: zebrad::components::sync: starting sync, obtaining new tips state_tip=Some(Height(3061822))

zebra-1  | The application panicked (crashed).

zebra-1  | Message:  called `Result::unwrap()` on an `Err` value: Constraint { value: -11372616, range: 0..=2100000000000000 }

zebra-1  | Location: zebra-state/src/service/finalized_state/disk_format/transparent.rs:761

zebra-1  | 

zebra-1  | Diagnostic metadata:

zebra-1  | version: 2.5.0

zebra-1  | Zcash network: Mainnet

zebra-1  | running state version: 27.0.0

zebra-1  | initial disk state version: 27.0.0

zebra-1  | features: default,default_release_binaries,howudoin,indicatif,metrics_exporter_prometheus,progress_bar,prometheus,release_max_level_info,sentry

zebra-1  | branch: VERGEN_IDEMPOTENT_OUTPUT

zebra-1  | git commit: d1a3c74

zebra-1  | commit timestamp: VERGEN_IDEMPOTENT_OUTPUT

zebra-1  | target triple: x86_64-unknown-linux-gnu

zebra-1  | rust compiler: 1.85.0

zebra-1  | rust release date: 2025-02-17

zebra-1  | optimization level: 3

zebra-1  | debug checks: false

zebra-1  | 

zebra-1  | Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.

zebra-1  | Run with RUST_BACKTRACE=full to include source snippets.

zebra-1  |