Skip to content
NIMRO
$NIMROTBARun a job

How Nimro works.

Four parts: a job specification, a scheduler that runs it in Web Workers, fingerprints of the specification and the result, and a small contract on Robinhood Chain that stores those fingerprints.

Job specifications

A specification is a small JSON object with a version, a kind and the settings of that kind. It fully decides the result: the data for hashing comes from a seed, the sample picture is generated from a seed, the resize filter uses integer arithmetic, and JSON steps are six fixed operations with no code evaluation. Any engine that follows the rules gets the same bytes.

KindId on chainCounts
SHA-256 hashing1bytes
Prime sieve2numbers
Image resize and compress3pixels
JSON transform4records

The scheduler

Jobs wait in a queue and start in order while fewer than your chosen number are running. Each attempt gets its own Web Worker.

An attempt that throws or passes its timeout is retried after 250 ms, then 500 ms, then 1 s, up to the attempts you set. A specification that can never succeed (for example invalid JSON) is not retried.

Cancel terminates the worker, so the processor stops working at once. Wall time is measured by the page; busy time is measured inside the worker around the computation itself.

Fingerprints

The specification hash is keccak-256 of the specification written as canonical JSON (keys sorted, no spaces). The result hash is keccak-256 of the canonical JSON of { v: 1, kind, result }.

For pictures, the result covers the resized pixels, not the compressed file: encoders differ between browsers, the pixels do not. A picture you chose is identified in the specification by its SHA-256, so a verifier needs the same file.

NimroJobLedger

NetworkRobinhood Chain · chain id 4663
Owner, fee, upgradeNone, none, none
Gas per recordabout 253,000

Functions

  • record(bytes32 specHash, bytes32 resultHash, uint8 kind, uint32 durationMs)

    Stores one run for the caller and returns its id. Refuses empty hashes, an unknown kind, and the same caller recording the same spec and result twice.

  • run(uint256 id)

    The stored run: runner, kind, duration, chain block, timestamp, both hashes.

  • runOf(address runner, bytes32 specHash, bytes32 resultHash)

    The id a runner got for that spec and result, or 0.

  • specRuns(bytes32 specHash, uint256 offset, uint256 limit)

    Run ids for one specification, newest first, at most 100 per call.

  • runnerRuns(address runner, uint256 offset, uint256 limit)

    Run ids recorded by one address, newest first, at most 100 per call.

  • runCount(), specRunCount(bytes32), runnerRunCount(address)

    Totals for paging.

  • chainBlock()

    The chain's own block number (read from the ArbSys precompile, since block.number reports the parent chain here).

Event

JobRecorded(uint256 indexed id, address indexed runner, bytes32 indexed specHash, bytes32 resultHash, uint8 kind, uint32 durationMs, uint64 recordedBlock)

What a record proves: this address claimed this specification produced this result, at this block. What it does not prove: that the result is correct (rerun it on the verify page) or that the duration is real (it is self-reported).

Planned, not live

  • Hosted compute nodes

    Planned

    Run the same specifications on servers, with the same fingerprints, so results stay comparable with browser runs.

  • AI compute jobs

    Planned

    Inference and batch processing on rented hardware. Requires partners and pricing that do not exist yet.

  • Developer API

    Planned

    Submit specifications and read results from other applications. No endpoint is open today.

  • Workload orchestration across devices

    Planned

    Spread one batch over several machines a team controls, with the scheduler you use here.

  • $NIMRO utility

    Planned

    Compute credits, job payments or service access. Options only; see the token page.

Limits and risks

Browser jobs are bounded by your device: large sieves or pictures can be slow on a phone, and a closed or sleeping tab stops work.

Records on Robinhood Chain are public and permanent. Do not record specifications that contain private data; a JSON input is part of its specification.

The contract code has not been independently reviewed yet. Its tests (unit, fuzz, invariant and a fork test) are in the repository.

$NIMRO has no live utility. Nothing on this site is an offer or a promise of value. Token page