zainod 0.6.0

Crate containing the Zaino Indexer binary.
Documentation

zainod

zainod is the Zaino indexer daemon — an indexer for the Zcash blockchain, written in Rust.

It sits between a Zcash full validator (Zebra or Zcashd) and client applications, serving:

This crate ships the zainod binary. The library half of the crate, zainodlib, exposes the run entrypoint and configuration types for embedding the daemon in other Rust programs.

For project background and architecture, see the Zaino repository.

CLI

zainod generate-config [--output FILE]   # write a default config file
zainod start [--config FILE]             # start the indexer

When --config/--output is omitted, the path defaults to $XDG_CONFIG_HOME/zaino/zainod.toml (falling back to $HOME/.config/zaino/zainod.toml).

Configuration is layered, highest priority first:

  1. environment variables (prefix ZAINO_),
  2. the TOML config file,
  3. built-in defaults.

Sensitive fields (passwords, secrets, tokens, cookies, private keys) cannot be set via environment variables and must come from the config file.

Launching

zainod needs a running validator to connect to. The examples below assume one is reachable at the address in your config.

From crates.io

cargo install zainod
zainod generate-config            # writes the default config, then edit it
zainod start                      # uses the default config path
# or point at an explicit file:
zainod start --config ./zainod.toml

From source

git clone https://github.com/zingolabs/zaino.git
cd zaino
cargo run --release -p zainod -- start --config ./zainod.toml

With Podman (rootless)

The daemon is published as a container image with zainod start as the default command. It runs as a non-root user (UID 1000) and refuses to start as root, which makes it a natural fit for rootless Podman.

Run it directly, mounting a config file and a data volume:

podman run --rm \
  -p 8137:8137 \
  -p 8237:8237 \
  -v ./zainod.toml:/app/config/zainod.toml:ro,Z \
  -v zaino-data:/app/data \
  zainod:latest

--userns=keep-id maps the container's UID 1000 to your host user, so files in the mounted data volume stay owned by you:

podman run --rm --userns=keep-id \
  -p 8137:8137 \
  -v ./zainod.toml:/app/config/zainod.toml:ro,Z \
  -v zaino-data:/app/data \
  zainod:latest

A typical deployment runs zainod alongside Zebra with podman compose:

services:
  zaino:
    image: zainod:latest
    ports:
      - "8137:8137"   # gRPC
      - "8237:8237"   # JSON-RPC (if enabled)
    volumes:
      - ./config:/app/config:ro,Z
      - zaino-data:/app/data
    depends_on:
      - zebra

volumes:
  zaino-data:
podman compose up

See docs/docker.md for the full container guide.

License

Apache-2.0.