Transparency · verification
How to verify a provably fair crash game, step by step
'Provably fair' only means something if you can actually do the proof. Here's the full mechanism — server seed, client seed, nonce, and the hash-to-multiplier formula — plus exactly how to recompute a real round and confirm it was fixed before you bet.
- A provably-fair crash point is computed as crashPoint = floor((100 − edge) ÷ (1 − h)) ÷ 100, where h is the first 13 hex characters of the round hash read as a 52-bit fraction (13 × 4 bits), the model Bustabit introduced and still publishes through its creator's hash-chain verify.js (7 August 2020, re-read 6 October 2026).
- The hash combines three inputs, typically HMAC_SHA256(serverSeed, clientSeed:nonce); the server seed's hash is shown before you bet and the seed itself only after, which is what makes the commitment checkable.
- The house edge is produced by instant busts at 1.00× on a fraction of rounds equal to the edge: about 1 in 100 rounds at 99% RTP, 3 in 100 on Aviator at 97% (Spribe's figure, restated on Tuttosport's Aviator page updated 1 October 2026; read 6 October 2026), 5 in 100 on Rollbit X Crash.
- Verification takes five steps and any offline SHA-256/HMAC tool; you never need the casino's own calculator.
- Verification proves integrity (the result was fixed before your bet), not value: EV stays at −(house edge) on every verified round.
What does provably fair mean in a crash game?
It means you can prove after the round that the operator committed to the result before you bet and could not change it once your wager was in. The operator publishes a hash of a secret server seed in advance and reveals the seed afterwards; because the hash cannot be reversed, the two must match. It is a guarantee of integrity, not of good odds.
A provably-fair game lets you prove, after the fact, that the operator committed to a result before you bet and could not have altered it based on your wager. It does this with cryptographic commitment: the server picks a secret (the server seed), shows you a hash of it in advance, and only reveals the secret later. Because a good hash can't be reversed, the operator is locked in — the hashed value they showed you can only have come from the seed they later reveal.
Critically, this proves integrity (the result wasn't manipulated), not fairness of odds in the everyday sense. The house edge is still baked into the formula. Provably fair means "not rigged against you beyond the stated edge" — not "a good bet". Keep that distinction in mind throughout.
What are the server seed, client seed and nonce?
The server seed is the operator's secret, shown only as a hash until revealed; the client seed is a string you control, so neither side can fix the result alone; the nonce is a counter that increments every round so one seed pair yields a fresh result each time. Combined, usually as HMAC_SHA256(serverSeed, clientSeed:nonce), they produce the hash the crash point is read from.
- Server seed: a long random string the operator generates and keeps secret. You see only its hash (e.g. SHA-256) until it is revealed.
- Client seed: a string you control (often editable in settings). Because the result depends on your input, the operator can't have pre-computed a result tailored against you — neither side can fix the outcome alone.
- Nonce: a counter that increments each round, so the same seed pair produces a fresh result every round without re-seeding.
The three are combined — typically HMAC_SHA256(serverSeed, clientSeed:nonce) — to produce the hash that determines the crash point. Change any one and you get a completely different, unpredictable result. That per-player recipe fits single-player games such as dice. A shared multiplayer crash round has one result for every player, so it cannot depend on each player's own client seed: Bustabit and BC.Game instead commit a whole chain of hashes in advance and salt it with a value nobody controls, and Aviator mixes in the seeds of the first three players to bet (details below).
How is the crash point calculated from the hash?
Take the first 13 hex characters of the round hash, read them as an integer and divide by 2⁵², giving a uniform fraction h between 0 and 1. The crash point is then floor((100 − houseEdge) ÷ (1 − h)) ÷ 100: a small h gives a low multiplier, an h close to 1 a huge one, and the uniform distribution of h is what makes P(reach m) = RTP ÷ m. The industry-standard conversion from hash to crash point is:
where h is a fraction in [0,1) derived from the hash. The common derivation takes the first 13 hex characters of the hash, reads them as an integer, and divides by 2^52 — a 52-bit value (13 hex digits × 4 bits = 52 bits). So:
Worked intuition: when h is small, 1 − h ≈ 1 and the crash point is near (100 − edge)/100 — a low multiplier. When h is close to 1, 1 − h is tiny and the multiplier balloons toward the game's maximum. The distribution of h being uniform is exactly what makes P(reach m) = (100 − edge)/100 ÷ m = RTP/m. This is the distribution implied when every cashout target returns the same RTP. Bustabit publishes this formula in full (its verify.js computes 99 / (1 − X), floors it, divides by 100 and never returns less than 1.00); most operators publish the RTP but not their full distribution, so for them the formula is the standard model rather than a published fact.
Why does the instant-bust rate equal the house edge?
Here is the elegant part. The house edge isn't an extra fee bolted on — it's produced by forcing a small fraction of rounds to bust instantly at 1.00×. Specifically, a fraction of rounds equal to the house edge is mapped to an immediate bust:
- 99% RTP (1% edge): ~1% of rounds instant-bust at 1.00×
- 97% RTP (3% edge, Aviator): ~3% of rounds instant-bust
- 95% RTP (5% edge, Rollbit X Crash): ~5% instant-bust
That's why a higher-edge game "feels" like it busts early more often — because it literally does, on more rounds. Our simulator reproduces this faithfully: switch the edge and watch the instant-bust frequency (and your ruin rate) rise.
How do you verify a crash round yourself?
Five steps: note the hashed server seed and your client seed before playing, play your rounds, rotate the seed so the old one is revealed, hash the revealed seed and confirm it equals the hash you noted, then recompute each round's HMAC and crash point and compare with what you saw. Any offline SHA-256 tool reproduces the numbers. The general procedure, which works on any operator that exposes the seeds:
- Before playing, note the hashed server seed the operator displays, and set (or note) your client seed.
- Play your rounds. The nonce increments each round.
- Rotate / reveal the server seed. Most sites require you to "rotate" to a new seed before they'll reveal the old one — this prevents you peeking at future results.
- Confirm the commitment: hash the revealed server seed and check it matches the hash shown in step 1. If it matches, the operator couldn't have changed the seed after you bet.
- Recompute each crash point: compute
HMAC_SHA256(serverSeed, clientSeed:nonce)for each round, take the first 13 hex chars, deriveh, and apply the formula. The result must match the crash points you observed.
You don't need to trust a calculator — any SHA-256/HMAC tool (including offline ones) reproduces these values. Reputable operators also publish their own verifier and the exact derivation. If a site can't show you the seeds and the formula, it is not meaningfully provably fair.
How do Stake, BC.Game and Bustabit implement provably fair?
Stake publishes seed and hash data for its shared Crash rounds in its Fairness section; its editable client seed, hashed server seed and nonce apply to single-player Originals such as Dice. BC.Game commits a chain of 10,000,000 results in advance and plays it in reverse. Bustabit, the 2014 original, publishes an open 52-bit formula and seeded its chain through public BitcoinTalk events. Aviator offers a seed reveal; Spaceman does not.
| Game | Commitment method | What you can recompute | Source / checked |
|---|---|---|---|
| Stake Crash | Shared round committed in advance; seed and hash data published in the Fairness section (per-player client seed + nonce applies to single-player Originals) | Past rounds from the published data | Stake Fairness section and docs as read July 2026; stake.com refused automated requests on 29 Oct 2026, so not re-checked |
| BC.Game Crash | Pre-generated chain of 10,000,000 results consumed in reverse | Any past round from the chain hash | BC.Game Crash fairness page as read July 2026; not re-checked |
| Bustabit | Hash chain seeded publicly; open 52-bit formula | The entire chain from the terminating hash and salt | Creator's verify.js gist, 7 Aug 2020; re-read 6 Oct 2026 |
| Aviator (Spribe) | Operator's server seed (16 random symbols) committed as a SHA-256 hash before the round, merged with the client seeds of the first three bettors; the result comes from the SHA-512 of the merge | Each round's seeds and combined hash, from the round's provably-fair window; Spribe does not publish the hash-to-multiplier step | Aviator game client's Provably Fair text and spribe.co/provably-fair, read 29 Oct 2026 |
| Spaceman (Pragmatic Play) | Certified RNG, no seed reveal | Nothing round-by-round | Pragmatic Play game sheet as read July 2026; game page re-read 29 Oct 2026 (RTP 95%) |
- Stake: a Fairness section with a built-in verifier. For single-player Originals you get an editable client seed, a pre-shown hashed server seed and a nonce; Crash is a shared round, so you check it against the seed and hash data Stake publishes for Crash rather than against your own seed.
- BC.Game: a pre-generated chain of 10,000,000 results played in reverse — the whole sequence is committed in advance and consumed backwards, so outcomes can't be reordered.
- Bustabit: the original and most open — a self-verifiable 52-bit formula, public BitcoinTalk seeding events, and open-source elements. The gold standard.
- Provider games (Aviator, Spaceman): Aviator offers provably-fair verification; Spaceman is RNG-based and generally does not expose a crypto seed reveal — a real transparency gap versus the crypto originals.
- Aviator in Spribe's own words (Aviator game client's Provably Fair text, read 29 October 2026): the round result is "generated from four independent participants of the round: game operator and first 3 betters of the round." The operator generates a server seed of 16 random symbols and shows its SHA-256 hash in Provably Fair Settings ("Next server seed SHA256") before the round; when the round starts the game merges that seed with the three client seeds and derives the result from the SHA-512 hash of the merge. The fairness window then shows the server seed, the three players' seeds, the combined hash and the result. Two limits: Spribe does not publish how the SHA-512 hash becomes a multiplier, so you can confirm the commitment and the combined hash but not recompute the multiplier from a public formula; and in multi-room mode each room has its own server and player seeds. The game's rules also say a crash at 1.25× means the multiplier reached only 1.24×, so an auto-cashout set exactly at the crash multiplier loses, and that bets affected by a malfunction are void and refunded.
What does provably-fair verification prove, and what does it not?
Be precise about the guarantee:
- It proves: the result was fixed before your bet and matches the published formula; the operator didn't tamper round-by-round.
- It does not prove: that the game is a good bet (the edge is real and negative), that the operator is solvent or licensed, or that an unrevealed server seed was generated randomly rather than cherry-picked from many candidates (a subtle attack reputable, audited operators mitigate). Verification is necessary for trust, not sufficient on its own.
In short: provably fair is a powerful, checkable integrity guarantee — and a great reason to prefer crypto originals over black-box RNG. It is not a route to profit. The maths in our strategy guide still holds: EV = −(house edge), verified or not.
Frequently asked questions
How is a crash game's crash point calculated?
From a cryptographic hash of the server seed, your client seed and a nonce. The first 13 hex characters of the hash form a 52-bit fraction h, and crashPoint = floor((100 − houseEdge)/(1 − h))/100. The hashed server seed is committed before the round and revealed after, so you can verify it.
What does provably fair actually guarantee?
That the result was fixed before you bet and was not manipulated round-by-round — you can recompute it and check the server-seed hash matches. It does not make the odds good: the house edge is still built into the formula and the game remains negative-EV.
Why do higher house-edge crash games bust early more often?
Because the instant-bust frequency at 1.00x equals the house edge: about 1% of rounds at 99% RTP, 3% at 97%, 5% at 95%. A higher edge literally forces more rounds to bust immediately.
Can I verify a crash result without trusting the casino's tool?
Yes. Any independent SHA-256/HMAC tool reproduces the same hash, so you can recompute the crash point from the revealed seeds yourself and confirm it matches both the published hash and the observed result.
Formula and derivations reflect the standard industry model; exact implementation details (hash function, hex-digit count) can vary slightly by operator — always check the operator's own fairness documentation. Educational content, 18+.