---
title: "Performance certificates: making providers prove their hardware"
description: "Since v0.4.2, a provider can't take a lease until it has run a sixty-second benchmark the network can check, and can't outsource."
url: https://xe.marketized.io/blog/performance-certificates
published: 2026-04-02
topics: ["Releases", "Security", "Compute"]
authors: ["XE Protocol"]
---

# Performance certificates: making providers prove their hardware

_April 2, 2026 · 1 min read_

Since v0.4.2, a provider can't take a lease until it has run a sixty-second benchmark the network can check, and can't outsource.

A marketplace for compute is only as good as the honesty of its listings. v0.4.2 makes providers prove what their machines can do before they're allowed to accept a lease.

## A benchmark with a receipt

On startup, a provider runs a benchmark of about sixty seconds: a SHA-256 hash chain of 375 million iterations, followed by a memory-hard phase. The result is a **performance certificate**: attested timestamps, a score, and merkle-root proofs of the work.

- Certificates are broadcast over the `xe/certificates` GossipSub topic, and every node caches them.
- Any node serves any provider's certificate at `GET /certificate/{provider}`.
- The format is compact: merkle roots instead of full arrays cut a certificate from 2.6 KB to 837 bytes.

## Why it can't be faked

The memory-hard phase builds a 256 MB lookup table and makes a million reads from it, each one depending on the last. Doing that over a network instead of in local memory would be about ten thousand times slower, so a provider can't rent the benchmark out to faster hardware somewhere else.

> **Enforced by the ledger:** `lease_accept` is checked against the gossip cache: the certificate has to exist, belong to the provider, and not have expired.

## Also in v0.4.2

- Timekeeper attestations are mandatory on `lease_accept` and `lease_settle`. Self-reported timestamps are gone.
- Certificates with the wrong iteration count are rejected.
- Provider nodes refuse to start without `sys.timekeepers` in the state chain.

See the [changelog](https://xe.marketized.io/docs/changelog) for the full release.
