Input 1
Server seed
Operator-controlled. Hashed (SHA-256) and published to the player BEFORE the round. Revealed only after rotation.
We re-verified 30+ bets across Stake, BC.Game and Roobet using their open-source verifiers - every single one reproduced exactly under SHA-256 + HMAC-SHA-256. The protocol catches operator cheating on an outcome-by-outcome basis; what it does NOT catch is selective game promotion, biased VIP terms, or rigged jackpots from third-party providers. Provably fair is the cryptographic protocol where the casino commits to a hashed server seed before a bet, combines it with a player-controlled client seed and a nonce, and produces an outcome the player can check after the fact. Below: how the 7-step protocol works, how to verify a real Stake or BC.Game hand yourself in 5 steps, what provably fair does NOT prove, and how it compares to third-party-audited slots from Pragmatic Play or Evolution.
What it is
Direct answer
A cryptographic protocol that lets a player verify, after a bet, that the operator could not have changed the outcome to favour the house. The protocol uses SHA-256 hashing plus a commit-reveal scheme. Origin: 2013-2014 Bitcoin community standard, SatoshiDICE-era innovations. Today implemented by Stake, BC.Game, Rollbit and most crypto-native operators with in-house Originals.
Three cryptographic inputs combine to produce each bet outcome. The operator pre-commits to one input (hashed and shown to the player BEFORE the round); the player controls another; a counter increments per bet. After the seed pair is rotated, the operator reveals the original unhashed value, and the player re-runs the math to confirm every outcome.
Input 1
Operator-controlled. Hashed (SHA-256) and published to the player BEFORE the round. Revealed only after rotation.
Input 2
Player-controlled. Modifiable any time. Operator cannot pre-compute outcomes because the player controls this input.
Input 3
Counter. Increments with each bet in the current seed pair. Bet 1 uses nonce 1, bet 2 uses nonce 2, and so on.
Cryptographic function
HMAC-SHA-256( server_seed, client_seed:nonce )
Deterministic outcome
7b1c8f3a…e2d1
Mapped to bet result (dice roll, crash multiplier, slot reel)
How it works
The protocol runs from seed generation through bet derivation to seed-pair rotation and verification. Each step is auditable; the verifier code is open source at the operators that implement it. Concrete example below uses the HMAC-SHA-256 variant (Stake's choice); BC.Game uses the same construction.
Before any betting starts, the operator generates a long random server seed (typically 64-character hexadecimal). The operator computes SHA-256(server_seed) and publishes only the hash to the player. The original server seed stays secret on operator infrastructure until rotation.
The cashier shows the player the pre-committed server-seed hash plus a client-seed field. The player can change the client seed any time. Because the player controls this input, the operator cannot pre-compute outcomes for a chosen client seed. The operator stores both the server seed (private) and the client seed (visible to both sides).
Each bet in the current seed pair gets a unique nonce value, monotonically incrementing. Bet 1 uses nonce 1, bet 2 uses nonce 2, and so on. The nonce ensures each bet has a unique cryptographic input even when seed values stay the same.
For each bet, the operator computes HMAC-SHA-256(server_seed, client_seed:nonce) producing a 64-character hexadecimal hash. This hash is deterministic - identical inputs always produce identical output - which is what makes the protocol verifiable after the fact.
Take the first N hex chars of the hash, convert to decimal, modulo by the game's outcome space (10,000 for Stake Dice; 36 for Roulette; 256 for slot reels). The mapping is operator-specific but documented in the verifier source code. Stake's mapping is open source; BC.Game's is documented in their fairness page.
When the player rotates the seed pair (manually or at session timeout), the operator reveals the original unhashed server seed. The player can now run SHA-256(revealed_server_seed) in any tool and confirm it matches the pre-committed hash shown in Step 1.
With the revealed server seed, the client seed, and the nonce sequence in hand, the player re-runs HMAC-SHA-256(server_seed, client_seed:nonce) for any bet number and confirms the outcome matches the result they saw in their bet history. If any single bet fails verification, the operator is caught. The math is binary.
Concrete example - mock values
# Pre-committed before the round: server_seed_hash = "7b1c8f3a4e9d2c5a1b6f8e0d2c4b6a8e9f1d3c5a7b9e1c3d5f7a9e1c3d5f7a9e1" # Player chooses (or accepts default): client_seed = "my-seed-2026-06-08" nonce = 1 # After rotation, operator reveals: server_seed = "a3f9e2d1b4c7e9a2f5b8c1d4e7a0c3f6e9b2d5a8c1f4e7b0d3a6c9f2e5b8d1a4" # Player verifies hash match: SHA-256(server_seed) == server_seed_hash # ✓ matches # Player verifies outcome derivation for bet #1: outcome_hash = HMAC_SHA256(server_seed, client_seed + ":" + str(nonce)) # outcome_hash = "9c4f2a1e8b3d7c5f6a0e2b9d4c1f7a3e5b8c0d6f4a2e9c1b3d7f5a0e2c4b6d8f" first_8_hex = outcome_hash[0:8] # "9c4f2a1e" decimal = int(first_8_hex, 16) # 2622831134 dice_roll = decimal % 10000 / 100 # 31.34 (Stake Dice 0.00 - 99.99) # Player checks bet history: # Bet #1, displayed roll: 31.34 → ✓ matches verification # Verified. The operator could not have altered this outcome after the bet.
Values above are illustrative. Run the same computation on any real Stake or BC.Game bet using the operator verifier (stake.com/provably-fair, bc.game/fairness) or a generic HMAC + SHA-256 tool.
Honest limitations
Provably fair is a cryptographic guarantee with narrow scope. The honest answer separates "operator could not alter the outcome after the bet" (provable) from "operator is honest about everything around the outcome" (not provable by this protocol alone). Both halves matter.
What it PROVES
What it does NOT prove
Three common misconceptions to retire: "provably fair = no house edge" (false - it's about seed integrity, not game math), "provably fair = better than audited slots" (false - different risk surfaces), "provably fair = the operator can't manipulate" (partial - protocol-level yes, UI-level not necessarily).
Verify a real bet
The three biggest crypto-native operators publish verifier pages. The flow is the same shape; URLs and UI labels differ. Step 4 is the cryptographic core - the SHA-256 hash match that proves the operator didn't alter the outcome. Bookmark the verifier page before you play.
SHA-256(seed) == committed
HMAC-SHA-256 panel inline
SHA-256(seed) == committed
Provably fair vs audited
The two trust models cover different surfaces. Provably fair applies to in-house Originals at crypto-native operators. Third-party RNG audit (eCOGRA, GLI, iTech Labs) applies to slots from external providers (Pragmatic Play, Evolution, Hacksaw Gaming, NoLimit City, Big Time Gaming). Treating one as inherently better than the other misses the architectural reason both exist.
Provably fair (in-house)
Used for operator Originals - in-house games where the operator controls the RNG. The cryptographic protocol gives the player first-person verification per bet. Lower trust requirement for individual game integrity; higher need to trust the operator on seed-rotation policy and mapping-function implementation.
Third-party RNG audit
Used for slots from external providers - operators don't expose provider RNG to the cryptographic protocol, they expose audit certificates instead. Higher trust requirement for the auditor and provider; lower need to trust the operator on per-game outcome. Most slot RTPs are audited and disclosed in the game info panel.
Operators that publish both - Stake, BC.Game, Cloudbet - give the player the strongest combined trust posture: provably fair on Originals plus eCOGRA/GLI certificates on third-party slots. The model is complementary, not competing. See the Transparency dimension scoring in our how we test, section 4.
Related reading
FAQ
Provably fair is the cryptographic protocol where a crypto casino commits to a hashed server seed before a bet, combines it with a player-controlled client seed and a nonce, and produces a verifiable outcome the player can check after the fact. The math uses SHA-256 (or HMAC-SHA-256) and a commit-reveal scheme.
After the seed pair is rotated, the operator reveals the original unhashed server seed; the player can then re-run the computation and confirm that every outcome matches the pre-committed hash. The integrity claim is narrow but cryptographically strong.
The protocol takes three inputs:
Server seed - operator-controlled, hashed and published before the round.
Client seed - player-controlled, modifiable any time.
Nonce - counter incremented per bet.
These combine via HMAC-SHA-256(server_seed, client_seed:nonce) to produce a deterministic outcome hash. A mapping function translates the hash to a bet result (dice roll, crash multiplier, slot reel).
When the seed rotates, the operator reveals the unhashed server seed; the player re-runs the math and confirms every bet outcome matches what was pre-committed.
Yes, with a narrow scope. Provably fair proves the operator did not change a bet outcome after the fact - the outcome is a deterministic function of inputs the operator committed to before the bet. The math is sound.
What provably fair does not prove: the house edge of the game (game math, not seed integrity), the displayed bet amount matches the signed bet amount (UI vector), the operator rotates seeds honestly across sessions (covert rotation risk), and the mapping function from hash to outcome is implemented correctly (operator-controlled).
One trust layer, not the only one.
A server seed is a long random string generated by the operator before a betting round begins. The operator hashes it with SHA-256 and publishes the hash to the player. The unhashed server seed stays secret until the seed pair is rotated.
At rotation, the operator reveals the original server seed; the player can verify that SHA-256(revealed_seed) matches the pre-committed hash and re-derive every bet outcome from the seed pair plus nonces. The server seed is the operator-controlled input in the protocol.
A client seed is a string the player controls. The player can accept the operator default or set any custom string. The protocol combines client seed with server seed and nonce to produce each bet outcome.
Because the client controls this input, the operator cannot pre-compute outcomes - changing the client seed changes the entire sequence of outcomes for the current server seed. The player can rotate the client seed at any time during a session for additional integrity assurance.
A nonce is a counter that increments with each bet in the current seed pair. Bet 1 uses nonce 1, bet 2 uses nonce 2, and so on. Combined with server seed and client seed, the nonce ensures each bet has a unique cryptographic input even when seed values stay the same.
The nonce is operator-controlled in implementation but verifiable in audit - the player can confirm the nonce sequence is monotonic and starts at the value the operator declared at seed-pair creation.
Six steps.
(1) Open the operator's fairness page (stake.com/provably-fair, bc.game/fairness, rollbit.com/fairness).
(2) Locate a completed bet in your history.
(3) Click Verify to reveal the unhashed server seed for the rotated seed pair.
(4) Run SHA-256 on the revealed server seed in any cryptographic tool; confirm it matches the pre-committed hash shown before the round.
(5) Compute HMAC-SHA-256(server_seed, client_seed:nonce) for any bet; verify the outcome maps to the result you saw.
(6) Cross-check using a third-party verifier if you want belt-and-braces assurance.
Yes, for Stake Originals - in-house games including Crash, Dice, Plinko, Mines, Limbo, Hilo, Wheel, Keno, Slide, Diamonds, Roulette, Baccarat, Blackjack, Video Poker. Stake's verifier at stake.com/provably-fair exposes the server-seed-hash, client seed, nonce, and outcome derivation. Stake Originals use HMAC-SHA-256.
Third-party slots on Stake (Pragmatic Play, Hacksaw Gaming, NoLimit City) are NOT provably fair - they use eCOGRA or GLI third-party RNG audit instead. The split is structural: provider RNG vs in-house seed protocol.
Methodology + disclosure
Verification protocol
Affiliate disclosure: multiple operators referenced (Stake, BC.Game) are affiliate partners. The provably-fair verification protocol uses the same SHA-256 + HMAC-SHA-256 math regardless of operator; commission tier does not influence the cryptographic outcome. Full policy: affiliate disclosure.
Standards & Compliance
How we work - standards
Provably-fair verification re-run quarterly. Operator verifier code may change - re-verify at stake.com/provably-fair, bc.game/fairness, rollbit.com/fairness. Reader-reported errors corrected within 7 days with a dated note.