Shielded Vote

Full Node Setup

zvote-1

Run A Full Node

Run a regular Shielded Vote full node to follow the chain from a verified snapshot and independently check finalized vote tallies. This is not a validator: it does not generate validator keys, join the validator set, run a vote-share helper, or expose a public URL.

  1. Provision The Full Node Host

    Minimum recommendation before restoring the latest zvote-1 snapshot.

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

    Linux arm64 is also supported. macOS is useful for local development and audit work.

  2. Run The Full-Node Installer

    The installer discovers the active chain version from voting config, downloads the matching svoted release, validates genesis, restores the latest snapshot, and installs a local service.

    curl -fsSL https://shielded-vote.nyc3.digitaloceanspaces.com/join-full.sh | bash
  3. Wait For The Tip

    The installer exits after catching_up=false. After that, keep the service running so your local state continues to track the chain tip.

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

Verify A Tally

Once a round is finalized, use your synced full node to re-run the threshold tally check locally. The command recombines validator partial decryptions and checks them against the finalized totals.

  1. Enable Local REST Queries If Needed

    svoted query talks to the local CometBFT RPC by default. Enable REST only when you also want to inspect JSON responses through localhost:1317.

    APP_TOML="${SVOTE_HOME:-$HOME/.svoted-full}/config/app.toml"
    sed -i.bak '/\[api\]/,/\[.*\]/ s/enable = false/enable = true/' "$APP_TOML"
    sudo systemctl restart svoted-full
  2. Run The Verifier

    svoted query vote verify-tally <round-id-hex> --node tcp://localhost:26657
  3. Inspect The Published Result

    ROUND_ID="<round-id-hex>"
    curl -fsS "http://127.0.0.1:1317/shielded-vote/v1/tally-results/${ROUND_ID}" | jq
    curl -fsS "http://127.0.0.1:1317/shielded-vote/v1/vote-summary/${ROUND_ID}" | jq

Cross-Check The Ratified Key

Wallets surface a round only when the coordinator configuration attests to the round's election-authority key. Compare the ea_pk in your local round query with the matching round attestation in dynamic-voting-config.json.

ROUND_ID="<round-id-hex>"
curl -fsS "http://127.0.0.1:1317/shielded-vote/v1/round/${ROUND_ID}" | jq '.round.ea_pk'
curl -fsS https://voting.valargroup.org/prod/dynamic-voting-config.json | jq --arg round_id "$ROUND_ID" '.rounds[]? | select(.vote_round_id == $round_id)'

Node Operations

  • Linux logs. journalctl -u svoted-full -f
  • macOS logs. tail -f ~/.svoted-full/node.log
  • Status. svoted status --home ~/.svoted-full
  • Reset from scratch. Re-run with SVOTE_FORCE_RESET=1.

References