What you trust, and what you can verify
GPUFarm runs compute offchain on independent hosts and settles payment on Robinhood Chain. This page states exactly which parts are enforced by smart contracts, which are signed and checkable, and which you are trusting GPUFarm's servers or a host to do correctly.
Onchain vs offchain#
Robinhood Chain is the settlement and trust layer, not the compute layer. Nothing that would be expensive, private or high-frequency goes onchain.
| Component | Where | Notes |
|---|---|---|
| Job escrow (max payment) | Onchain | ComputeEscrow holds the customer's maximum payment from createJob until release, refund or dispute resolution. |
| Compute receipt | Onchain | The JobCompleted event: job hash, provider, farm, customer, amount, GPU-seconds, start/end, workload type, result hash, challenge end. |
| Payouts & refunds | Onchain | Credited per job to the RewardDistributor; each payee claims with claim(token) (pull payments). |
| Farm identity, host keys | Onchain | GPUFarmRegistry stores only owner, metadata hash, active flag and commission; owners authorize their daemons' host keys. |
| The workload itself | Offchain | Containers run on the host's GPUs inside a sandbox. Never onchain. |
| Scheduling & matching | Offchain | The coordinator picks a compatible machine and offers the job with a 10-second reservation. |
| Heartbeats, telemetry, logs | Offchain | Stored by the coordinator; never written to the chain. |
| Inputs & outputs | Offchain | Object storage behind short-lived signed URLs scoped to one job. Only hashes reach the chain. |
| Benchmarks & reputation | Offchain | Measured by the coordinator from benchmark challenges and real job history. |
Who verifies compute#
The coordinator's verifier key signs an EIP-712 Completion after a job passes verification. It is an attestation key: it holds no funds and sends no transactions. Anyone (the host, the customer, a keeper) submits the signed completion to the escrow.
Completion(bytes32 jobKey, address provider, bytes32 farmId, uint256 amount,
uint64 computeSeconds, uint64 startedAt, uint64 completedAt,
bytes32 workloadType, bytes32 resultHash, uint64 sigDeadline)
Refund(bytes32 jobKey, uint64 sigDeadline)Before signing, the coordinator runs these checks on the uploaded result:
- Re-hashes the output bundle from storage and compares it with the host-reported
resultHashand the host-signed receipt (personal_sign by the daemon's host key). - Checks execution telemetry from the assigned GPU UUIDs during the run: utilization, memory and temperature samples. A run that claims success with no utilization on its GPUs is flagged.
- For workloads with a registered deterministic verifier, recomputes the expected output independently and compares it — the only path to RESULT VERIFIED.
- Computes billable GPU-seconds as the shorter of host-reported and server-observed runtime, capped at the job's max runtime.
Payment finalization#
The backend can never simply declare “job completed” and take the escrow. Money moves only through these paths, each enforced by ComputeEscrow:
| Path | Who | When |
|---|---|---|
| Customer approves early | Customer | Customer submits completeJob themselves (immediate release), or calls releasePayment any time while the job is Completed. |
| Challenge window passes | Anyone | After a verifier-signed completion, 1 day runs. Once it ends without a dispute, anyone can call releasePayment. |
| Dispute resolved | Job's arbiter | Only for a disputed job; the arbiter splits the completed amount between the provider and the customer. |
| Refund | Customer / anyone | A funded job refunds in full after its deadline (customer) or at once with a verifier-signed Refund (anyone may submit). |
The amount in a completion is the customer's charge — compute plus the platform fee added on top — and can never exceed what the customer escrowed. On release the escrow splits it so the fee recipient gets exactly the fee and the provider side gets the full compute charge (any rounding unit stays with the host). Anything the job didn't use goes back to the customer. Exact formula
| Who | Receives |
|---|---|
| Customer pays | Compute (billable GPU-seconds × the host's rate) + the platform fee on top, at the fee bps snapshotted when the job was funded. |
| Host (provider) | Its full quoted compute rate — minus the farm owner's commission only if the job ran in a farm with a commission registered in GPUFarmRegistry. |
| Farm owner | That commission (≤ 20%), taken from the compute share, never added to the customer's bill. |
| Protocol fee recipient | The platform fee: A × feeBps / (10,000 + feeBps) of the charge A, i.e. the fee that was added on top. |
| Customer refund | Unused escrow: maxPayment − A, credited back to the customer at release. |
Disputes and the arbiter#
- During the challenge window the customer calls
openDispute(job result problem, missing output, host terminated early, invalid output). The escrow freezes: nothing can be released. - The arbiter reviews the job spec, logs, GPU telemetry, the result and server hashes and the host-signed receipt — all of which GPUFarm keeps for the job.
- The arbiter calls
resolveDispute(jobKey, providerAmount). It can only choose how much of the completed charge is paid out (≤ amount) — that award is split into fee, farm commission and host share exactly like a normal release — and everything else returns to the customer. It cannot send funds to any other address, including itself. - The arbiter address is snapshotted into each job when it's funded; replacing the arbiter later never affects existing jobs.
- If a dispute is not resolved within 30 days, anyone can call
resolveExpiredDisputeand the customer is refunded in full.
Cryptographically verifiable vs trusted#
- Escrow balances, job status and every state change (contract storage + events)
- Compute receipts: JobCompleted with result hash, GPU-seconds and amount
- Payout and refund credits, and your claimable balance in the RewardDistributor
- The verifier signature on every completion (EIP-712, recoverable)
- Host-signed receipts and benchmark reports (EIP-191 by the daemon's host key)
- Result hashes: sha256 of the output bundle you download
- Signed daemon releases (sha256 + Ed25519)
- The scheduler to match fairly and not skip hosts arbitrarily
- Telemetry reported by host daemons (NVML readings can't be proven to the server)
- The verifier's attestation that checks passed — for HOST REPORTED jobs, that is the main signal
- The coordinator's storage to keep inputs, outputs and logs intact until settlement
- Network statistics and reputation numbers computed from the coordinator's database
- The arbiter's judgment in a dispute
Verification levels#
Every completed job gets exactly one label. GPUFarm never labels everything “verified”.
| Level | Meaning | How it's reached |
|---|---|---|
| Result verified | Output was deterministically checked: an independent re-run or verifier produced the same result hash. | A server-side deterministic verifier recomputed the output and the hashes match. V1 ships one built-in: the selftest workload. |
| Execution verified | Telemetry from the assigned GPUs and the integrity of the uploaded result were confirmed. The output itself was not re-computed. | Result hash re-computed from storage matches the host receipt, and telemetry shows the assigned GPUs working during the run. |
| Host reported | The host reports completion, but the workload is not independently reproducible and telemetry was insufficient to confirm execution. | Hash integrity holds, but the workload isn't reproducible and telemetry was insufficient to confirm execution. Use the challenge window. |
Failures and refund guarantees#
- Host disappears before running: the job is re-offered to another compatible machine. The customer pays nothing for the lost attempt.
- Host fails or disconnects mid-run: the assignment is abandoned and the job re-queued (up to its attempt limit), else marked FAILED.
- A FAILED or canceled funded job gets a verifier-signed
Refund; anyone can submit it and the full escrow is credited back to the customer. - If GPUFarm's servers vanished entirely, the customer can still call
refundafter the job's deadline (max runtime + 24 h queue allowance + 1 h, at most 30 days). No server cooperation needed. - Duplicate settlement is impossible: each transition requires an exact current status, so a job settles or refunds once.
- Payouts are pull-based: a payee who can't receive funds can't block anyone else's settlement.
If a key is compromised#
| Compromised | Could | Could not |
|---|---|---|
| Verifier key | Sign completions for currently funded jobs naming any provider and any amount up to each job's escrow; sign refunds (which only return money to customers). | Bypass the challenge window — customers can still dispute every fraudulent completion before release. Affect jobs funded after the verifier is rotated. |
| Arbiter key | Decide disputed jobs unfairly, within the split between that job's customer and provider. | Touch undisputed jobs, pay any other address, or exceed the completed amount. |
| Contract owner | Change verifier, arbiter, fee recipient, fee (≤ 10% on top of compute), challenge window (1 h–7 d) and the stablecoin allowlist — for jobs funded afterwards. | Move escrowed or credited funds, change terms of existing jobs, upgrade the contract (no proxy), or renounce ownership into a dead state. |
| Coordinator servers | Mis-schedule, show wrong statistics, withhold artifacts, and — because the verifier key lives there — everything the verifier key could. | Release escrow without a valid verifier signature, skip the challenge window, or block the customer's deadline refund. |
| A host | Return wrong output for non-reproducible work (labeled HOST REPORTED), fake telemetry, or quit mid-job. | Get paid without a verified completion, reach other jobs' inputs (per-job signed URLs), or read its own daemon's signing key from a workload. |