~nockmark / api

Everything the board shows comes from these endpoints. No accounts, no keys: a valid STARK proof of the server's own challenge is the only credential a submission needs.

Read
GET/leaderboard

All verified runs, ranked by server-observed proving rate.

curl https://nockmark.xyz/leaderboard
GET/runs/:id

One verified run by id, same shape as a leaderboard entry.

curl https://nockmark.xyz/runs/1
GET/economics

Current network difficulty (expected proof attempts per block, auto-refreshed from the chain), block reward, and the estimated whole-network proving rate. Pass ?pps= to price a rate of your own.

curl 'https://nockmark.xyz/economics?pps=0.22'
GET/economics/history

Difficulty over time as [unix_secs, difficulty] pairs, oldest first, thinned to ≤ 1000 points. ?hours= bounds the lookback (default 168, max 2160).

curl 'https://nockmark.xyz/economics/history?hours=720'
Submit
POST/challenge

Mint a proving challenge. Returns the nonce to prove against, k (proofs required), pow_len, and the nonce derivation rule. The ranked rate is measured from this moment to submission, server-side.

curl -X POST https://nockmark.xyz/challenge
POST/run

Submit k base64-jammed STARK proofs for a challenge. Every proof is checked (challenge binding, then full verification) before anything is recorded; the practical path is the one-liner on the board, which mints, proves, and submits for you.

tock bench --kernel assets/miner.jam \
  --submit https://nockmark.xyz
AI-PoW track (CPU and GPU)

What these rates cover. The AI track grinds the canonical block shape, and the GPU rows are behind upstream: they use the generic CUDA kernel at the nockchain commit this registry pins, and two days after that pin upstream made a peak kernel the production default — the same card on the same statement goes from 0.19 to 335 TMAC/s, about 1,700x. Read the GPU rows as a floor for the hardware; a re-pin and re-run is pending. Nockchain also admits mining inside real model inference, at throughput comparable to the optimised dedicated kernel — the notable part being that the compute is dual-use, not that it is faster. The ZK track is CPU-only for a different reason: its GPU provers are closed source and report unverifiable pool units, so they are absent rather than taken on trust.

POST/challenge?track=ai

Mint an AI-PoW challenge for the Logos puzzle (INT8 tiled matmul + recursive STARK certificate). Returns the kernel-minted nonce, the 32-byte challenge derived from it (blake3("nockmark-ai-v1" ‖ nonce_le8)), the jackpot target Tb, k (wins required), the fixed params, the statement, and the grind rule.

?statement= selects which AI-PoW statement to be challenged on. It defaults to dense, so a request without it means exactly what it always did.

?attempts= requests a difficulty tier: the expected grind attempts per win you want to be targeted at. The server derives the target from it — respecting each statement's own semantics, so the same tier is a different 32 bytes on dense and on canonical-moe — and echoes the granted value back as attempts. Clients still read target; omitting the parameter reproduces the previous behaviour exactly, target and response alike.

Why letting the client choose cannot inflate a rate. The ranked figure divides real MAC-equivalents by a window this server observed, and a tier only changes how much of that window is grinding rather than the fixed ~25 s-per-win of certificate proving: an easy tier earns less credit against that same fixed overhead and therefore scores lower, so there is nothing to gain by asking for one. A hard tier cannot lift a machine above its true throughput either, because every attempt it is credited for is genuinely performed — the credit is exactly the expected attempts at the target the wins were verified against, and a win only exists if a jackpot really cleared it.

curl -X POST 'https://nockmark.xyz/challenge?track=ai&statement=canonical-moe&attempts=1048576'
POST/run?track=ai

Submit k jackpot wins. Each win's certificate is verified end-to-end before anything is recorded: statement re-derived from (challenge, extranonce) — matrices re-synthesized, every public input re-checked, HASH_JACKPOT ≤ target — then the compact STARK verify against the server's own setup.

For canonical-moe the submission carries nothing but the certificate and its public inputs: the whole statement — Pearl header, mining config, matrix commitments, routing, opened indices, jackpot — is re-derived here from (challenge, ordinal) and the jackpot is gated at target × F before the compact STARK verify.

tock ai-bench --statement canonical-moe --submit https://nockmark.xyz
GET/leaderboard?track=ai

Both statements rank on this one board, by verified_mac_per_sec_lb. They share it because MAC-equivalents is precisely the unit consensus uses to compare AI work of different shapes: expected MAC-equivalents per block is 2^256 / T whatever tile shape the miner picked, which is what makes the AI puzzle's fork-choice weight meaningful in the first place. Each attempt is F = 216 MAC-equivalents (an 8×8 tile over k=1024) on both statements; what differs is the attempt count, because the target semantics differ — 2^256/(T+1) for dense, 2^256/(T·F+1) for canonical-moe. Every row carries its own statement and its own target, so a re-calibration cannot rewrite how an older row was scored.

Runs are era-labeled by prover_version. Entries proved before pin c8d6b13e used the pre-Pearl-V3 statement, whose AIR was later hardened upstream (urange8 lookup fix). Cross-era rate comparisons are fine — the workload cost is the same — but era-1 certificates were verified under the older constraint system.

curl 'https://nockmark.xyz/leaderboard?track=ai'
429rate limits

The two POST routes are rate-limited per IP. Over-limit responses carry a Retry-After header and {"retry_after_secs": …} in the body — sleep that long and retry.