Verification
Anyone can join the network with a GPU, so no node is trusted by default. Staking, sampled re-execution and signed receipts make every response accountable.
Stake first, serve second
Every operator stakes TOPO before it receives traffic. The stake is collateral for every response the node signs, and the value a node can serve at once is capped by its stake.
Sampled re-execution
- A sample of requests is re-run by three independent attestors on different hardware.
- Sampled requests use fixed decoding settings, so outputs are comparable token by token.
- Three of three attestors must agree before a sampled response settles.
- A mismatch slashes the node's stake, and the request is served again on another node at no cost to you.
| Node state | Requests sampled |
|---|---|
| New node, first 7 days | 20% |
| Established node | 2% |
| After a mismatch, for 24 hours | 50% |
Requests with topo.verification: "strict" | 100% |
Strict verification
Set topo.verification to strict and every response is checked by all three attestors before it is released. It adds about 40 ms of latency and 15% to the cost.
request.json
json
{ "model": "claude-sonnet-5.5", "messages": [{ "role": "user", "content": "Extract the totals from this invoice" }], "topo": { "verification": "strict" }}Verify a receipt
Receipts are signed with the node's ed25519 key and included in an on-chain batch root. Check both yourself with the SDK.
import { Topo } from "@topolabs/sdk"; const topo = new Topo(); const receipt = await topo.receipts.get("req_7Hq2kf91");const check = await topo.receipts.verify(receipt); console.log(check.signature, check.includedInBatch); // true truefrom topolabs import Topo topo = Topo() receipt = topo.receipts.get("req_7Hq2kf91")check = topo.receipts.verify(receipt) print(check.signature, check.included_in_batch) # True True