The validator samples miner receipts, replays the corresponding job manifests, writes signed verdicts, computes score windows, and optionally publishes Bittensor weights.
In the current owner-operated v1 design, the validator and orchestrator can run on the same machine with full bucket access.
Bucket access:
export S3_BUCKET=...
export S3_REGION=us-east-1
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...Dev signature secrets:
export LOCUS_OWNER_SECRET=owner-dev-secret
export LOCUS_MINER_SECRET=miner-dev-secret
export LOCUS_VALIDATOR_SECRET=validator-dev-secretAll three must match the secrets used by the orchestrator, miners, and validator during a dev run. Production subnet mode should replace this with wallet-backed signatures.
Dry-run mode computes scores and prints a weight payload without calling the chain:
locus-v3 validator \
--run-id RUN_ID \
--sample-rate 1.0 \
--publish-weightsWith explicit S3 flags:
locus-v3 validator \
--run-id RUN_ID \
--sample-rate 1.0 \
--publish-weights \
--s3-bucket "$S3_BUCKET" \
--s3-region "$S3_REGION"Install the subnet extra:
uv sync --extra subnet
source .venv/bin/activateThen run:
locus-v3 validator \
--run-id RUN_ID \
--validator-hotkey VALIDATOR_HOTKEY \
--sample-rate 1.0 \
--publish-weights \
--set-weights \
--wallet-name WALLET_NAME \
--hotkey-name HOTKEY_NAME \
--network finney \
--netuid NETUIDThe adapter normalizes non-negative scores before publishing. Hotkeys that do not map to current metagraph UIDs are dropped and reported.
If a manifest output has an ArtifactCryptoPolicy, the validator enforces it:
signed: verify the artifact envelope signature before comparing tensors.encrypted: decrypt the envelope before tensor decoding.drand_timelock: decrypt only after the configured drand round is available.
If a timelocked artifact is not yet revealable, the verdict is inconclusive
rather than fail. Re-run the validator after the reveal round to settle the
receipt.
The validator builds score windows from receipts and verdicts:
score = pass_cu + unsampled_cu * trust_multiplier
If sampled failures dominate, trust_multiplier drops to 0.0, which also
discounts unsampled work from that hotkey.
For each sampled receipt:
- Load the receipt.
- Load the referenced manifest.
- Verify owner manifest signature.
- Verify miner receipt signature.
- Verify the manifest hash matches the receipt.
- Decode inputs and check input digests.
- Replay the graph on the validator device.
- Compare outputs using the manifest verification policy.
- Write a signed verdict.
Verdicts are stored under:
v3/netuid=<N>/verdicts/<run_id>/validator=<V>/<receipt_id>.json
Score windows are stored under:
v3/netuid=<N>/scores/window=run=<run_id>/scores.json
Receipts may arrive after the first validator pass. It is safe to run the validator again:
locus-v3 validator --run-id RUN_ID --sample-rate 1.0 --publish-weightsAlready-verdict receipts are skipped; new receipts are replayed and added to the score window.