Run a validator
Independent validators fetch the same signed accounting assignment for each chain epoch, verify it and compute weights locally. They submit with their own registered hotkey and validator permit. No owner SSH, provider API keys, GPU or miner Phala VM is needed.
The reviewed public release is v0.5.1, from official validator releases. This is separate from the miner's everycli version. The validator package is not published to PyPI.
#Requirements
Use Linux, a reliable connection to a Finney archive RPC, a mainnet SN117 hotkey with an active validator permit, and durable private state storage. Registration alone does not grant a permit. Signing also needs the matching existing wallet and explicit local authorization.
#Install and check read-only
docker pull ghcr.io/everyframe-studio/everyframe-validator:v0.5.1
docker run --rm --network none ghcr.io/everyframe-studio/everyframe-validator:v0.5.1 --version
docker volume create everyframe-validator-state
docker run --rm -v everyframe-validator-state:/state \
ghcr.io/everyframe-studio/everyframe-validator:v0.5.1 init \
--state-dir /state --validator-hotkey YOUR_PUBLIC_SS58
docker run --rm -v everyframe-validator-state:/state \
ghcr.io/everyframe-studio/everyframe-validator:v0.5.1 doctor \
--state-dir /state --check-emissionsUse these initialization commands only for a new state volume. Never reinitialize an existing validator to upgrade or repair it. Read-only checks do not unlock a signing key or submit transactions.
For continuous dry-run operation:
docker run -d --name everyframe-validator --restart unless-stopped \
--read-only --cap-drop ALL --security-opt no-new-privileges \
--tmpfs /tmp:mode=1777,size=256m \
-e BITTENSOR_RUNTIME_CACHE_DIR=/state/runtime-cache \
-v everyframe-validator-state:/state \
ghcr.io/everyframe-studio/everyframe-validator:v0.5.1 \
run --state-dir /state#Wallet configuration
The wallet path is the parent of named wallet directories. For wallet default, hotkey default, use /root/.bittensor/wallets, which resolves to /root/.bittensor/wallets/default/hotkeys/default.
For Docker, mount the intended wallet root read-only at /wallets and use /wallets in the container's profile. Give the container's UID 10001 access without making key files public. Do not mount unrelated wallets.
A defaultpub.txt file is not required when the hotkey file already contains public metadata. Never copy a private hotkey into a public sidecar or create a replacement wallet to fix a path error. See wallet troubleshooting.
#Explicit signing
Signing is a deliberate operator action. Configure the existing wallet, check that its hotkey matches the profile, and verify doctor before authorizing. A source installation uses the following commands; inside Docker use the same arguments with the persistent state and read-only wallet mount:
everyframe-validator doctor --state-dir ./state/mainnet117 --check-emissions
everyframe-validator authorize --state-dir ./state/mainnet117 \
--days 30 --max-submissions 1000 --yes
everyframe-validator run --state-dir ./state/mainnet117 --submitThe state path must be the one you initialized, not a second profile for the same hotkey. Without --submit, operation remains read-only. Authorization is local, time-limited and submission-limited; it is different from the miner's non-expiring authentication. Preserve state and keep only one signing instance per hotkey.
The default scheduler enforces its zero-fee policy; a nonzero or unavailable fee estimate blocks signing. Chain conditions and consensus affect rewards. Use the official README for complete container mounts, Compose and source-install examples.