TensorCash.Verify

Guide

Verifying blocks

A TensorCash node that delegates its Full check over HTTPS can use Boblabs Verification as its verifier, with nothing more than a URL and a key. Anything else (a wallet, an explorer, a script) can submit a block and poll for the verdict with two HTTP calls.

Pointing a node at the service

In bitcoin.conf:

validationapi=desktop
validatorhttpurl=https://api.verify.tensorcash.boblabs.eu
validatorapikey=tvk_…

or on the command line, -validationapi=desktop -validatorhttpurl=https://api.verify.tensorcash.boblabs.eu -validatorapikey=tvk_…. The node then submits every block it validates and polls for the result on its own; there is nothing else to configure. No trailing slash on the URL.

Several verifiers. validatorhttpurl takes a comma-separated, ordered list (primary first), and validatorapikeys one key per URL in the same order:

validatorhttpurl=https://verify.example.org,https://api.verify.tensorcash.boblabs.eu
validatorapikeys=key-for-example-org,tvk_…

Environment variables do the same for packaged and container deployments: VALIDATOR_HTTP_URL and VALIDATOR_API_KEY for one verifier, VALIDATOR_BASE_URLS and VALIDATOR_API_KEYS (comma-separated) for a list.

The API name has a publicly trusted certificate; the node's default trust store accepts it. Mainnet only: a testnet node must not be pointed here.

Submitting a block yourself

The body is the ValidationRequest FlatBuffer with a BlockValidation, as a node builds it for the block (schema shared-utils/fb-schemas/validation.fbs in the TensorCash repository). It must carry the block's height and ruleset. Send X-Verify-Result-Contract: scoped/1 so the reply is keyed by everything it was judged under.

curl -sS https://api.verify.tensorcash.boblabs.eu/v1/verify/full/request/submit \
  -H "Authorization: Bearer $TVK" \
  -H "Content-Type: application/octet-stream" \
  -H "X-Verify-Result-Contract: scoped/1" \
  --data-binary @block.bin
Reply Meaning
202 Queued or running. status_ref is the path to poll; retry_after_seconds says when.
200 The result, at once. Blocks already on the chain are usually answered this way.

Poll until final is true:

curl -sS "https://api.verify.tensorcash.boblabs.eu$STATUS_REF" \
  -H "Authorization: Bearer $TVK"
{
  "status": "Full_Green",
  "verdict": "Full_Green",
  "final": true,
  "hash_id": "6f1c…e2a9",
  "verification_type": "full",
  "scope": {"network": "tensor-main", "operation": "Full", "height": 29301, "ruleset": 4, "…": "…"},
  "scope_key": "9a4e…02bd",
  "policy": {"ruleset": 4, "model_identifier": "Qwen/Qwen3-8B@9c92…", "detector": {"entry_digest": null, "state": "na"}},
  "execution": {"executed_at": 1791325410.8, "elapsed_ms": 10400, "cached": true}
}

A Quick check (CPU, seconds, no model replay) is the same two calls against /v1/verify/quick/request/submit; use it when you want a fast structural answer rather than the model verdict.

Statuses

Status Meaning
Full_Green The proof is valid: the model ran and the chain rules hold.
Full_Red The proof failed.
Full_Amber Completed without a decision either way; details says why. A node applies its own rules to an Amber.
Quick_OK / Quick_Fail The CPU checks passed / failed.
pending Not finished; poll status_ref.

A 202 with "state": "needs_reverify" and an outcome object means the last attempt produced no verdict (for instance no capable worker was connected). It is not a verdict: keep polling, the service retries on its own. Every string is listed in Statuses.

Updated 2026-10-07