Verifiable AI inference, explained.
Dendra is a sovereign Cosmos-SDK L1 where consumer GPUs serve AI inference, paid in a fixed-supply token — and every answer is economically verifiable on-chain: a cheating miner is slashed. It's a drop-in OpenAI API — start with the quickstart. Canonical source: the litepaper.
Overview
A client submits an end-to-end-encrypted prompt; the chain escrows a fee and assigns a miner through an unpredictable decentralized-VRF seed; the miner runs the model locally on its GPU and is paid optimistically; a sampled fraction of jobs is re-checked by a fresh committee with an LLM-as-judge, and cheating is slashed — all settled in a fixed-supply, zero-inflation token. Consensus is CometBFT BFT; miners are not validators, so owning a GPU never secures consensus. The novelty is the useful-work market layered on top.
API quickstart — for integrators
Dendra is a drop-in OpenAI API: no custom SDK. Any OpenAI client works — only base_url changes — and a response served by a miner additionally carries a dendra proof block your code can act on. The gateway lives on api.dendranetwork.com; self-hosters point base_url at their own gateway instead.
https://api.dendranetwork.com/demo/v1 is the keyless demo tier: no key, rate-limited, answers 200. https://api.dendranetwork.com/v1 is the keyed tier: without a key it answers 401 {"error": "unauthorized"}. That 401 is the gateway working correctly, not a broken service — if you have no key, use the demo base URL. Anything that answers HTML reached the website instead: dendranetwork.com serves pages, not the API.dendra proof block. What it does not do is answer quickly: every job on this network is served by a single consumer GPU, so requests queue behind each other. Measured from outside on 2026-08-02, one llama3.1:8b request answered 200 in 203 seconds. That is a capacity figure and not a protocol property — it falls as operators join, and it is the one number on this page you should expect to be wrong in your favour later. Read /capacity for what is serving right now, give your client minutes rather than seconds, and treat a missing dendra block as a handled case: it is absent whenever no miner served the job.from openai import OpenAI
client = OpenAI(base_url="https://api.dendranetwork.com/demo/v1", api_key="unused")
r = client.chat.completions.create(
model="dendra-network",
messages=[{"role": "user", "content": "Capital of Australia?"}],
)
print(r.choices[0].message.content)
print(r.usage) # token counts (prompt / completion / total)
200 after 203 s:"content": "Canberra." · "usage": {"prompt_tokens": 9, "completion_tokens": 2, "total_tokens": 11} · "dendra": {"job_id": "job1785702644589", "miner_id": "dm1teqlpyx9sctv4d954eejvz", "audit_state": "pending", …}
The
dendra block is attached because a miner served the job, and job_id is on-chain — dendrad query jobs get-job job1785702644589 returns it, and so does anyone else's node. A response with no dendra block means no miner took the job; handle that case rather than raising on it.curl -s https://api.dendranetwork.com/demo/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"dendra-network","messages":[{"role":"user","content":"Capital of Australia?"}]}'
# keyed path — same body, plus the bearer token
curl -s https://api.dendranetwork.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" -H "Content-Type: application/json" \
-d '{"model":"dendra-network","messages":[{"role":"user","content":"Capital of Australia?"}]}'
Calls that return real data right now. These are reads, not inference, so they do not depend on a miner. Copy them as-is to confirm your network path reaches the chain and the gateway.
curl -s https://api.dendranetwork.com/demo/v1/models
# → {"object":"list","data":[{"id":"dendra-network","object":"model",…}]}
# the keyed tier without a key — 401 is the correct answer, not an outage
curl -s https://api.dendranetwork.com/v1/models
# → {"error": "unauthorized"}
# total supply, straight from the chain REST — 200
curl -s https://api.dendranetwork.com/rest/cosmos/bank/v1beta1/supply
# → {"supply":[{"denom":"udndr","amount":"10000000000000"}], …} 10,000,000 DNDR
# live protocol parameters, and how many GPUs are actually present — 200
curl -s http://api.dendranetwork.com:1317/dendra/jobs/v1/params
curl -s https://api.dendranetwork.com/capacity
# → "verified": {"live_nodes": 1, "gpus": 1, …} ← how many GPUs are actually serving
2 · What Dendra adds — the dendra block. Attached to a response whenever a miner actually served the job (non-stream: at the root; streaming: in the last SSE chunk, since the job settles after generation). No served job means no block, so branch on its presence rather than assuming it.
"job_id": "job_…", // the on-chain anchor of this inference
"miner_id": "dm1…", // bech32, derived from the operator address (ADR-039)
"committee": ["dm1…", "dm1…"], // the VRF-drawn committee
"beacon": "…", // anti-grinding randomness seed
"audit_state": "pending", // always "pending" at response time
"cost_udndr": 650, // real cost · 1 DNDR = 1,000,000 udndr
"escrow_udndr": 650,
"verify": { // cross-check without trusting the gateway
"proof_endpoint": "/proof", // may be relative — resolve it (see below)
"query": "dendrad query jobs get-job job_…"
}
}
- state
audit_stateis always"pending"at response time — the VRF-sampled audit lands after settlement. The verified state is read later on The Proof (recent_audits[].state) or viaverify.query, straight from the chain. - verifyTwo independent paths.
proof_endpointis a read-only feed (no secrets), served publicly athttps://proof.dendranetwork.com/proof; the gateway may return it as a relative path, so resolve it against yourbase_urlrather than passing it straight to an HTTP client.queryis thedendradcommand to re-check the job directly on-chain — no need to trust the gateway. - costReal numbers.
cost_udndrandusageare the actual settled cost and token counts, client-verifiable.
3 · Verify a response by script — the oracle pattern. The audit is asynchronous: re-read The Proof later, find your job_id in recent_audits, and branch.
PROOF = "https://proof.dendranetwork.com/proof" # public feed, read-only, no key
proof = json.load(urllib.request.urlopen(PROOF))
audit = next((a for a in proof["recent_audits"] if a["job_id"] == meta["job_id"]), None)
if audit is None: trust = "unaudited" # not drawn by the VRF (most jobs)
elif "clawed" in audit["state"]: trust = "rejected" # server was slashed — don't act on it
elif "resolved" in audit["state"]: trust = "vindicated" # audited and confirmed honest
else: trust = "pending" # audit in flight — re-read later
audit_sample_bps, governable — read 5000, i.e. 50%, on the chain today) that lands afterwards — so never treat "settled" as "verified": vindicated is the strong state, and rejected means the payment was clawed back and the miner slashed. On the network as it stands, the lottery is deferred on every block and no audit has concluded: committee_seed_source is 1, which requires a decentralized seed, and the beacon's floor of two contributors is counted per block — and with one contributor today it is met on none of them, so the draws that land below it are deferred. A drawn audit is still not a checked one: none has returned a verdict, because the jury is every registered miner except the one under audit and concluding takes audit_min_quorum = 4 of them voting. Read that state yourself at proof.dendranetwork.com/proof under vrf — contributors against min, read as a per-block sample rather than a standing state. Capacity varies with the network (research devnet).4 · Endpoint reference. Every row was called against the live network; the code shown is the one it returns.
| Endpoint | Role | Key | Code |
|---|---|---|---|
POST /demo/v1/chat/completions | inference, keyless demo tier — served, slowly (one GPU serves every job) | no | 200 |
POST /v1/chat/completions | inference, keyed tier | yes | 401 without |
GET /demo/v1/models | model list, keyless | no | 200 |
GET /v1/models | model list, keyed | yes | 401 without |
GET /health | gateway status | no | 200 |
GET /capacity | hardware inventory — operator-declared, not proven; reads live_nodes: 0 today | no | 200 |
GET /rpc/status · /rpc/validators | CometBFT RPC through the gateway | no | 200 |
GET /rest/cosmos/… · /rest/dendra/… | Cosmos REST through the gateway | no | 200 |
GET proof.dendranetwork.com/proof | The Proof — read-only verifiability feed | no | 200 |
Paths above are relative to https://api.dendranetwork.com unless a host is written out.
The same chain is also reachable on its native ports, which is what a joining node uses:
| Direct port | Role | Code |
|---|---|---|
:26657/status · /validators | CometBFT RPC | 200 |
:1317/cosmos/bank/v1beta1/supply · /dendra/jobs/v1/params | Cosmos REST — supply and live protocol parameters | 200 |
:8088/genesis.json · /network-info.txt | genesis file and join configuration | 200 |
:4500/ | faucet — drip size and proof-of-work difficulty | 200 |
:8645/ | encrypted relay bus — refuses an unauthenticated caller, which is correct | 401 |
How a request flows
Any OpenAI-compatible client points at the Dendra gateway (/v1/chat/completions) and uses the network without changing anything. The chain never sees your content — only a hash and metadata.
Encrypted request & escrow
The client encrypts the prompt to the miner's key and sends it through the gateway, which applies minimal regex-level filtering and locks the fee in a module account. Pricing is pay-per-token: fee = base + per_token × (in + out).
Unpredictable assignment
An on-chain ECVRF beacon (aggregated via ABCI++ vote-extensions, bound to the block hash) fixes the assignment seed. The requester can't grind the job id to pick a complicit miner, and splitting stake across identities doesn't help — the draw is stake-weighted, so multiplying identities lowers your odds. Choosing an identifier after the seed is public is a different attack, and it is still open (ADR-037, below).
Confidential inference
The assigned miner decrypts in RAM, runs the local LLM (via Ollama), anchors a commit on-chain, and the job settles. Under this genesis the miner's net share is retained rather than released, and resolves at the audit checkpoint. Plaintext exists only in memory during compute, behind sealed-memory and egress guards.
Sampled audit & slash
After the commit, the VRF seed decides whether the job is audited (a governable share, 5000 bps on this chain). On an audited job a fresh committee re-judges the answer with an LLM-as-judge; a wrong — or silent — miner is slashed hard on-chain. This step has verified nothing yet, and the binding reason is the jury rather than the seed: the draw does run on the blocks that meet the VRF contributor floor, but the jury is every registered miner except the one under audit, and concluding takes audit_min_quorum = 4 of them voting — five registered miners in all.
Verification — optimistic, LLM-as-judge
LLM output is non-deterministic, so byte-equality verification fails. Dendra uses an optimistic model (ADR-025/026/028): pay fast, then re-check a random sample with a fresh committee and an LLM-as-judge.
- k=1Paid optimistically. A single stake-weighted primary miner answers and is paid provisionally on auditable jobs. Cost falls from ~3× to ~1×; latency is one inference, which unblocks streaming and larger models.
- VRFSampled audit. The seed is posted after the commit via
H(seed ‖ jobId) mod 10000 < audit_sample_bps— the miner can't know in advance whether it will be checked. The rate is an on-chain governable parameter, set high (50%) on the current testnet to gather evidence fast. - judgeFresh committee + LLM-as-judge. On an audited job, the primary reveals to a fresh committee (excluding itself); each member runs an LLM-as-judge and commits a binary verdict. Operators run heterogeneous judge models because a shared model correlates judge errors — but that is an off-chain convention, not a rule of the network: no consensus path counts judge models or refuses a vote over one. A hard slash needs two independent locks: "invalid" from at least two-thirds of the anchored committee seats and a strict majority of the voting stake — jurors are drawn on-chain and anchored before they can vote. Both locks bind the vote; neither binds entry into the pool the jury is drawn from, which is the gap ADR-037 closes and which is still open (see the Security model below).
- slashHard slash and clawback. Proven divergence → the provisional payment is clawed back and the stake slashed (
slash_leak_bps= 8000, i.e. 80%). A miner that stays silent is slashed too (no evasion), with a dedicated penalty on top (silence_slash_bps= 2000). No slash below a verdict quorum (anti false-positive). The late-reveal appeal window is implemented but dormant:appeal_windowreads0on the chain, so an honest miner that was merely offline recovers through governance, not automatically. Do not count on it as an active protection.
Confidentiality — stated honestly
default Standard (Mode A)
End-to-end encrypted client↔miner (X25519 ECDH + AES-256-GCM). Nothing in clear at the relay or on-chain. The miner decrypts in RAM to compute, guarded by sealed memory, egress/disk guards and slashing — strong, detectable deterrence, not a cryptographic guarantee against a determined host. Software attestation (a signed, measured client checked against an allow-list) is implemented but not enforced on the public network: requiring it would mean pinning the exact build every third-party miner has to run, which would shut out independent operators. It is therefore not counted above.
planned · not available Datacenter tier
The intended design is that on datacenter GPUs, inference would run inside a hardware secure enclave for cryptographic confidentiality, aimed at regulated workloads. It is not implemented and cannot be selected. No hardware root of trust exists in the current code; every job runs on the standard path above.
Tokenomics — $DNDR
A fixed-supply utility token: the medium for paying for inference and rewarding miners. No mint, ever — rewards are released from a pre-allocated Reserve.
| Property | Value |
|---|---|
| Max supply | 10,000,000 DNDR — hard cap, zero inflation, zero mint |
| Base unit | udndr — 1 DNDR = 1,000,000 udndr |
| Genesis allocation | Community 34% · Reserve 33% · Validator treasury 27% · Team 5% · Faucet float 1% — 10,000,000 DNDR exactly, readable from the published genesis |
| Emission | Release of the pre-allocated Reserve only — a geometric, decreasing share of what remains. No minting, at any rate. |
| Release rate | A governable on-chain parameter (reserve_release_bps per epoch), not a fixed schedule: the launch genesis carries 2 bps of the remainder per epoch of 86,400 blocks. It is the drain rate of a pool, never a yield: it says how fast the Reserve empties, not what any participant receives. The parameter is stated, never converted into a rate per year — how long an epoch lasts in wall-clock time depends on the interval between blocks, which the consensus does not fix; it is a target that follows validator configuration and can change. Read the live values with dendrad query emission params -o json. |
| Emission flows | work (demand-gated 1.5×) · availability (slashable challenge) · security |
| Burn | 5% of fees (fee_burn_bps = 500) |
| Protocol cut | 15% of a job (protocol_fee_bps = 1500; split: validators 50% / dev 20% / treasury 30%) |
Custom modules hold no mint permission, and the standard mint module is removed from the chain binary entirely — fixed supply holds by construction, verified at boot (exactly 10,000,000 DNDR, single denom). The cap does not rest on a simulation: x/mint is absent from the genesis app_state and from the binary, so no code path can create a coin, and emission only moves what the Reserve already holds. The chain's own test suite locks it — app/fixed_supply_test.go fails if a minting module reappears, if any module account gains the minter permission, or if a committed genesis posts anything other than 10,000,000 DNDR. The demand counter that gates the work subsidy is a settlement-volume proxy, not a measure of external traction.
curl -s https://api.dendranetwork.com/rest/cosmos/bank/v1beta1/supply returns a single denom at 10000000000000 udndr — 10,000,000 DNDR — and the genesis file at api.dendranetwork.com:8088/genesis.json carries the five allocations above. No rate, yield or return is offered or implied anywhere, and testnet tokens have no monetary value.Get testnet DNDR — the faucet
A new address holds nothing, and a miner needs a bond before it can serve. Testnet $DNDR comes from a public faucet: http://api.dendranetwork.com:4500, 10 DNDR per address, once every 24 h, with per-IP and global daily caps.
The faucet is proof-of-work gated so that each new address costs CPU (anti-Sybil). Ask it for the current difficulty, mine the nonce, then post your address:
curl -s http://api.dendranetwork.com:4500/
# → {"status": "ok", "from": "...", "amount": "10000000udndr", "pow_bits": 20}
# mine the nonce, then claim
python3 - <<'EOF'
import hashlib, itertools, json, urllib.request
ADDR, BITS = "dendra1...", 20 # BITS = pow_bits reported above
for n in itertools.count():
h = hashlib.sha256(("%s:%d" % (ADDR, n)).encode()).digest()
if int.from_bytes(h, "big") >> (256 - BITS) == 0: break
req = urllib.request.Request("http://api.dendranetwork.com:4500/",
json.dumps({"address": ADDR, "pow": str(n)}).encode(),
{"Content-Type": "application/json"})
print(urllib.request.urlopen(req).read().decode())
EOF
- httpPlain HTTP, deliberately unauthenticated. Nothing secret travels there — a public address and a nonce — but the faucet's reply is not proof of anything. Confirm the credit against the chain: the wallet reads your balance from
api.dendranetwork.com/rpc. - 429Rate limited is the normal answer. One drip per address per 24 h, a per-IP daily quota, and a global daily cap — reached, they fail closed rather than draining the faucet account.
Four roles — pick yours before anything else
They are not variations of one another. They run different software, need different hardware, and carry different risk. Confusing them is the most common way to waste an afternoon here.
| Role | What it does | Hardware | Stake & risk |
|---|---|---|---|
| Miner | Serves inference. Paid out of the real fees of the jobs it answers. | NVIDIA GPU, ≥ 7 059 MB VRAM for the network default model (llama3.1:8b-instruct-q4_K_M). A larger card serves larger models and so accepts jobs a smaller one cannot. CPU-only works but is capped at a small model. |
Bonded $DNDR. A wrong or silent answer drawn at audit is slashed. |
| Judge | A miner that also votes on audits. This is the role that unlocks payment — without jurors, retained fees are never released. | ≥ 10 824 MB VRAM, or ≥ 26 000 MB system RAM to run the MoE judge on CPU while the GPU keeps mining. Launch with --judge. |
Same bond as a miner. An under-powered judge votes against answers that are correct but differently worded, and an unfair verdict costs an honest miner its stake — which is why the bar is on the model, not on goodwill. |
| Validator | Produces blocks and feeds the committee seed. Serves no inference. | No GPU. A VPS is enough. | Bonded $DNDR. Prolonged downtime means jail and a slash: read signed_blocks_window and min_signed_per_window from the chain, and run deploy/validator_health.sh — it prints your own margin rather than repeating a figure. |
| Full node | Follows the chain, serves RPC/REST. Signs nothing. | No GPU. | None. Nothing to lose, nothing to earn. |
deploy/hw_probe.sh — the same code the node runs — and reproduced here for orientation only. The probe names the tier-3 budget once and derives the VRAM floor from it, so a number rounded by hand on a web page turns eligible cards away. Ask your own machine:bash deploy/hw_probe.shIt answers mine, mine + judge, or neither, and it is the arbiter — this page is not.
audit_min_quorum + 1 eligible miners, because a verdict takes audit_min_quorum jurors voting and the jury excludes the miner it is auditing. Below that floor the chain refuses to create the job rather than creating one that could never be verified — which is exactly what used to happen. Today that count is zero.Run a miner
Mode A targets consumer hardware — an RTX-class GPU running a local ~8B LLM through Ollama. You are paid from real job fees; honest work is paid, lazy or wrong work is slashed. A one-command launcher brings up a testnet miner.
git clone https://github.com/DendraNetwork/dendra-network.git && cd dendra-network
Read the script before running it, on its own line. A pager is interactive: anything pasted after it is swallowed as keystrokes instead of being executed, so a single copy of both lines starts nothing. Quit with q, then launch.
less deploy/join.sh
CONFIG_URL=http://api.dendranetwork.com:8088/network-info.txt bash deploy/join.sh
curl … | sh. Piping a URL into a shell executes whatever the server returns at that instant — you never see the bytes, and there is nothing to compare a hash against. Cloning is auditable, and join.sh then verifies the genesis SHA-256 published in network-info.txt before joining, so a forged chain fails closed rather than quietly succeeding. If you prefer to fetch the single file, download it, check its digest with sha256sum against the repository, and only then execute it.You can run that check by hand before trusting anything:
curl -s http://api.dendranetwork.com:8088/genesis.json | sha256sum must print the digest published in network-info.txt — fetch both and compare them yourself. This page deliberately does not repeat the digest: the chain is resettable, a fresh genesis changes it, and a value copied into a web page becomes a second source of truth that drifts. A digest taken from anywhere other than network-info.txt will fail join.sh's check — which reads as an attack rather than as a stale page.- GPUConsumer NVIDIA GPU (e.g. RTX-class). To mine, enough VRAM to hold an ~8B model through Ollama; larger VRAM lets you serve larger models, and so accept jobs that a smaller node cannot. To judge the bar is higher and separate: a juror must run a model validated for that role, which means ≥ 10 824 MB of VRAM, or ≥ 26 000 MB of system RAM to run the MoE judge on CPU while the GPU keeps mining. Those numbers are not round because they are not chosen: the probe names the tier-3 budget once (
_JUDGE_MIN_BUDGET_MB= 9 200 MB) and derives from it the smallest VRAM that still clears it after the 15% headroom it keeps for the context window (_JUDGE_MIN_VRAM_MB); the CPU path carries its own un-lowerable floor (MOE_CPU_MIN_RAM_MB). A retyped “12 GB” turns eligible 11 GB cards away, which is why this page derives instead of copying. An under-powered judge votes against answers that are correct but differently worded, and an unfair verdict costs an honest miner its stake — which is why the gate is on the model, not on goodwill. Runbash deploy/hw_probe.sh; it answers for your machine and it is the same code the node uses. No amount, rate or return is implied — what a miner is paid comes from the fees of the jobs it actually serves, and on this chain that share is retained at settlement rather than paid out (see pay, below). - bondBonded stake. A miner posts real $DNDR as a bond. Correct work is paid; a wrong or silent answer drawn at audit is slashed — so the bond is your skin in the game.
- payThe protocol pays from block 1 — and the payment is retained. A settled job credits the client's fee less burn and protocol cut, but
hold_bpsreads10000on this chain, so the whole of the miner's net share goes into retention at settlement and resolves at the audit checkpoint. The seed check runs before the per-job lottery: on a block whose anchored VRF contributors stay below the floor of two, no job reaches the draw at all — a floor that is met on every block since the voting power was redistributed so that the second validator actually signs. Above it the lottery runs, and the two outcomes differ — a job it does not select finalises and releases, a job it does select opens an audit and stays retained until a committee returns a verdict. On this chain none ever has: that takesaudit_min_quorum= 4 jurors voting, and the jury excludes the miner under audit.vrf.contributors,vrf.minandaudits_openedon the proof feed tell you where the chain stands right now. Retained is neither cancelled nor expired — the amounts are dated and queryable withdendrad query jobs held-summary. No rate, yield or amount is offered or implied, and testnet tokens have no monetary value. - noneContribution is recorded, and nothing is promised. Every job, settlement, verdict and slash is written into its block, and snapshots are published at named heights so the record survives a reset. If a mainnet is launched the project intends that record to count among the inputs to an allocation — but no mainnet, distribution, amount, rate, date or eligibility is promised, and arriving early carries no advantage. There is no enrolment and nothing to claim.
- netOpen to join, and short of independent miners. Anyone can join permissionlessly. On the chain relaunched on 2026-08-22 there are two validators, both the project's, and no registered miner — which is precisely why nothing is verified and why the chat returns nothing. The beacon's two-contributor floor IS met — two contributors today, so audit draws are no longer deferred for want of a seed; none has ever concluded, because a verdict needs
audit_min_quorumjurors voting and the jury excludes the miner under audit — so the floor is five registered miners, not four. Outside miners running the judge role are the only thing that changes that. You would be joining a network to build, not one already running.
Security model — what secures the network
What secures it
- BFT consensus for ordering and finality (standard CometBFT assumptions).
- The economic verdict for correctness — up to an honest majority of the committee's stake.
- Real bonds and real slashing: lying costs actual value on-chain.
- A VRF beacon aggregated through ABCI++ vote-extensions and bound to the block hash.
Confidentiality
- End-to-end encrypted client↔miner; the chain and relay never see your prompt.
- The miner decrypts in memory, guarded by sealed memory, egress and disk guards, and slashing.
- Software attestation is implemented but not enforced on the public network — not an active protection.
- A datacenter hardware-enclave tier is planned; it does not exist and protects nothing today.
- Least-privilege permissions — no module can mint.
slash_leak_bps = 8000); a miner that stays silent takes a dedicated 20% penalty on top of the clawback (silence_slash_bps = 2000). Both are governable and both are readable from the chain. On this network, no slash has ever fired. The chain opened on a fresh genesis, and slashes.events, jobs.resolved_by_quorum and jobs.vindicated on the proof feed say so — but do not take the figures from here, because they cannot be anything else yet, and the reason is not the one this page used to give. Committees are drawn: jobs.audits_opened counts them. Not one has returned a verdict, because a verdict needs audit_min_quorum jurors to vote and the jury is every registered miner except the one under audit — at a single miner it is empty, and every draw lands in jobs.deferred_no_jury. A slash can only follow a verdict, so there has been nothing to fire on. The slash machinery is armed and exercised by the chain's test suite; it has produced no evidence on this deployment, and this page will not borrow evidence from anywhere else.OpenJob now anchors the pool unconditionally and every draw filters on that anchor; a missing anchor is an error, never a permissive default. It is not observable from outside — no genesis field and no route expose it — so this is a statement about the code you can read in the repository, not something a query can confirm.Status & roadmap
Built and covered by the test suite: the full inference round trip end to end, the on-chain economy in real coins (emission, bonds, slashing, burn, pools), E2E encryption, replay-safe settlement, an RFC-9381 ECVRF beacon aggregated through vote-extensions, on-chain miner-key anchoring, and secure-by-default settings. That is what the software does — not a report on this deployment.
What this public endpoint carries — read it, do not take it from this page. Counts change without this page changing, so it hands you the query rather than the number. curl -s https://proof.dendranetwork.com/proof answers with the height it was read at, plus jobs.total, jobs.settled, jobs.audited, slashes.events, and vrf.contributors against vrf.min. Quote it with its height and anyone can re-check you.
What holds whatever those counts say, because it follows from the protocol and not from the day: on a block below the VRF contributor floor every audit draw is deferred; above it a draw runs, and a job it selects still ends settled but not verified with its share held on-chain: the jury is every registered miner except the one under audit, an empty registry leaves it empty, and concluding takes audit_min_quorum = 4 jurors voting — five registered miners in all. A validator count is not a decentralisation either: two validators are bonded, both the project's, and neither reaches two thirds — so the anti-grinding seed is armed and the draw reads live VRF contributions. Stopping either validator stops block production for everyone: fault tolerance is zero, for the opposite reason to before. It resumes when the missing node returns, and the target is a third validator. The explorer prints that share next to the count, both read from the chain rather than from here. All of it clears as operators arrive — none of it needs a code or genesis change. The network is an endpoint to read, join and break; calling it distributed or decentralized today would be false, and the word "decentralized" is used on this site only for the VRF seed mechanism.
- nowPublic testnet, open to join. A published and verifiable genesis, a deployment kit a third party can run, a read-only on-chain proof feed, an OpenAI-compatible chat, and a regex prefilter at the gateway — a floor with known false negatives, not a guarantee that unlawful content is blocked.
- nextIndependent miners — five in total. That is what lets an audit conclude and releases the retained payments: audit_min_quorum is 4, the jury excludes the miner being judged, so four jurors must vote and a fifth is the one under audit. The seed floor above them is already met, in windows, by a second project validator. Then one-click miners and throughput measured across independent operators.
- laterBusiness & mainnet. A hardware-isolated privacy tier; image generation stays gated behind a verification design. Mainnet ships when it's right — no date promised.
Reference
The full technical spec — architecture, verification, tokenomics, security.
Apache-2.0. Read the chain code, the miner, the gateway, the judge. Break it.
Read-only feed of audited jobs and on-chain slashes, straight from the chain. Don't trust this page; verify.
Try verifiable inference — every answer carries its on-chain proof panel.