Shielded Vote

Validator Setup

svote-1

Fresh Join

Use Automatic for the supported install path. Switch to Manual when you need to build from source, manage TLS yourself, or run each setup stage directly.

  1. Provision The Validator Host

    Minimum production requirement: use at least this host size before running Fresh Join.

    Platform
    Linux amd64
    CPU
    4 vCPU
    Memory
    8 GB RAM
    Storage
    120 GB NVMe

    Linux arm64 is also supported. macOS builds are for local development, not production validators.

  2. Run Fresh Join

    Run this on the validator host. It initializes the validator, restores or syncs chain data, registers the operator for approval, and starts the local service.

    curl -fsSL https://vote.fra1.digitaloceanspaces.com/join.sh | bash

    The helper server runs with svoted on local port 1317. Wallets submit shares to a public HTTPS URL, so the installer asks how to expose that helper API:

    1. Skip Caddy. Use this if you already handle the public HTTPS certificate with a load balancer or reverse proxy.
    2. Custom domain + Caddy. The script installs Caddy, gets a Let's Encrypt certificate, and proxies https://your-domain to localhost:1317.
    3. Auto sslip.io + Caddy. The script builds a public HTTPS URL from the host's detected IPv4, installs Caddy, and proxies it to localhost:1317.

    When registration finishes, contact Valar Group and tell them your validator is pending approval.

  3. Publish The Vote Server URL

    Add the public HTTPS helper URL to vote_servers[] in dynamic-voting-config.json. If Fresh Join configured Caddy, use the URL it prints. If you skipped Caddy, use the public URL from your own HTTPS proxy. Add one JSON object with url and label, then open a PR from GitHub's edit flow. This can be done while the validator is still pending approval. Edit voting config.

  4. Back Up Validator Identity

    Back up config/priv_validator_key.json, config/node_key.json, keyring-test/, pallas.*, and ea.* encrypted off-host. Keep the validator signing key live on exactly one host.

What Your Validator Does

A validator is more than a block producer. It helps keep the private-voting protocol live while preserving the rule that no single party can decrypt individual votes.

  • Runs consensus. Your node participates in the CometBFT validator set, proposes and votes on blocks, and verifies the Shielded Vote transactions that enter the chain.
  • Publishes a vote server. The public HTTPS helper URL lets wallets submit encrypted vote-share payloads. The helper stores them durably, waits until the wallet-provided submit_at time, generates the share reveal proof, and submits MsgRevealShare to the chain.
  • Participates in DKG. When a vote manager starts a round, the chain snapshots eligible validators. Each validator automatically contributes Joint-Feldman DKG material, encrypts per-validator shares with ECIES, verifies the shares it receives, and acks the ceremony. The result is an election authority public key; the private key is never assembled by one validator.
  • Protects private tallying. Wallet votes are ElGamal encrypted to the election authority public key, and the chain accumulates only encrypted totals while the vote is open. When the round moves to tallying, validators automatically submit threshold partial decryptions for the encrypted accumulators.
  • Finalizes aggregate results. Once enough partial decryptions are on-chain, a proposer combines them and submits the plaintext totals. Individual votes are not decrypted; only the aggregate result for each option becomes public.

Safe Snapshot Reset

curl -fsSL https://vote.fra1.digitaloceanspaces.com/reset-validator-snapshot.sh | bash

Use this on an existing validator when chain data needs to be replaced from the latest pruned snapshot.

Optional overrides
Variable Default Meaning
SVOTE_HOME $HOME/.svoted Existing validator home to reset.
SVOTE_SNAPSHOT_BASE_URL https://snapshots.valargroup.org Snapshot service base URL.
SVOTE_SERVICE_NAME svoted systemd service name on Linux.
SVOTE_POST_RESTART_SYNC_TIMEOUT 600 Seconds to wait after restart for catching_up=false.
SVOTE_TMPDIR ${TMPDIR:-/tmp} Parent directory for staged snapshot files.

Node Operations

Follow service logs

journalctl -u svoted -f

View syncing status

svoted status --home ~/.svoted | jq '{height: .sync_info.latest_block_height, catching_up: .sync_info.catching_up}'

Monitor The Vote

Use the admin dashboard's active vote page to monitor the live round: Open vote status.

  • Monitor status. This page shows whether the vote is pending, active, tallying, or finalized, plus the information validators need to confirm the vote is progressing. The same dashboard also includes tools for preparing and publishing voting rounds, so validators may see sections that are not part of normal validator monitoring.
  • Interpreting shares. Shares will trickle in for each option during the voting period. The option with the most shares is not necessarily the option with the most voting power behind it: up to 5 notes from a single voter are split across 16 shares, and each share's value depends on the voter's hidden note values. The actual result is only known after the vote reaches tallying and finalizes; there is no public running vote-power total, only the final aggregate.
Destructive Validator Teardown Permanently removes local validator data, keys, and services.

Validator Teardown

This permanently removes the local validator home, validator keys, chain data, and services. If the validator identity files were not backed up first, this operator must join again as a new validator and wait for approval before participating.

Use this when a test host should stop being a validator. If a vote is already in progress, remove or replace this host's public URL in vote_servers[] before clients depend on it.

  1. Run The Teardown Script

    Run this on the validator host. The script requires typing REMOVE VALIDATOR before it deletes local state.

    curl -fsSL https://vote.fra1.digitaloceanspaces.com/remove-validator.sh | bash
    • Removes svoted and svoted-join services when present.
    • Deletes ${SVOTE_HOME:-$HOME/.svoted} and local join binaries under ${SVOTE_INSTALL_DIR:-$HOME/.local/bin}.
    • Backs up and removes generated Caddy config only when it clearly belongs to this validator.
  2. Remove Published References

    Remove this host's public helper URL from vote_servers[]. Otherwise clients may keep attempting to submit shares to a server that no longer exists. Edit voting config.

References