Provably fair lets you independently check that a game result was generated from pre-committed cryptographic inputs (hashes, seeds, and a nonce) rather than altered after the bet. You verify by matching the revealed server seed against its earlier hash, recomputing the HMAC/sha output with your client seed and nonce, then mapping that output to the game's published formula.
Provable Fairness - concise technical summary
- A server commits to a secret server seed by publishing its hash before play; later it reveals the seed so you can confirm the commitment.
- Your client seed (chosen by you) and a per-bet nonce make each round unique and reproducible.
- Most systems compute an HMAC (often HMAC-SHA256):
HMAC(serverSeed, clientSeed:nonce[:extra]). - The game maps the resulting hex to an outcome using a deterministic, documented algorithm.
- Verification is local: you can reproduce the exact output with standard crypto libraries or a provably fair verification tool.
- Provably fair does not guarantee good RTP, honest withdrawals, or that the game's mapping algorithm is player-friendly.
How cryptographic hashes underpin provable fair systems
Hashes make "commit-then-reveal" possible: the casino publishes a server seed hash up front, and later reveals the server seed, which must hash to the same value. This is the core of the provably fair crypto casino promise: you can detect post-bet changes to the server seed.
This approach fits you if you can access (a) the pre-game server seed hash, (b) the revealed server seed, (c) your client seed, (d) the nonce, and (e) the game's mapping rules. Don't rely on provable fair alone when you cannot retrieve all inputs, when results are generated "server-side only" with no disclosure, or when the casino rotates seeds without letting you export the round details.
Client seed, server seed and nonces: exact roles and lifecycle
To do provably fair hash and seed explained in practical terms, you need the exact lifecycle of each value and where to find it in the UI/logs.
- Server seed hash (commitment): shown before you bet (often in "Fairness" / "Seeds" settings). You must record it before the round(s) you verify.
- Server seed (reveal): shown after you rotate seeds or after a batch/session ends. You verify it hashes to the prior commitment.
- Client seed: ideally set by you (copyable). If it's "randomized" by the site, you can still verify, but you lose the benefit of user-controlled entropy.
- Nonce: increments per bet for the same seed pair (0/1-based depending on the site). Wrong nonce is the #1 cause of mismatches.
- Optional round salt: some games include extra fields (e.g., "cursor", "roundId", "betIndex"). You must include them exactly as specified.
Minimum toolkit: a text editor for copying values, a trusted local runtime (Node.js or Python), and the game's public fairness formula. If you prefer, use a provably fair verification tool provided by the casino, but treat it as a convenience-your strongest check is reproducing the computation offline.
| Game type (common) | Inputs you must have | Crypto step (typical) | Expected output you compare |
|---|---|---|---|
| Dice / Roll-under | serverSeedHash, serverSeed, clientSeed, nonce | HMAC-SHA256(serverSeed, clientSeed:nonce) | Derived float/number mapped to 0-99.99 (site-defined rounding) |
| Crash / Multiplier | serverSeedHash, serverSeed, clientSeed (sometimes), nonce (sometimes) | HMAC-SHA256 or SHA256 chain (varies by provider) | Multiplier from published formula (may include "house edge" constant) |
| Cards (Blackjack / Poker) | serverSeedHash, serverSeed, clientSeed, nonce, deck algorithm | HMAC-SHA256 stream → deterministic shuffle (e.g., Fisher-Yates) | Exact card order (deck) and dealt sequence for that round |
| Plinko / Slots-like | serverSeedHash, serverSeed, clientSeed, nonce, path/reel mapping | HMAC-SHA256 → multiple draws from hex | Ball path or reel stops derived from documented extraction method |
Step‑by‑step: verify a single game result locally (manual + automated)
Risk-aware limitations before you start:
- Only verify rounds where you captured the server seed hash before betting; otherwise you can't prove the commitment was pre-bet.
- Don't paste seeds into unknown websites; do the math locally to avoid leaking active seeds.
- If the site's mapping rules are undocumented or ambiguous (rounding, nonce base, separators), verification may fail even for honest games.
- A match proves the round's computation followed the disclosed algorithm; it does not prove the algorithm is fair-value or that withdrawals are safe.
-
Collect round data and freeze it
From the game's fairness panel/history, copy: server seed hash (pre-bet), revealed server seed (post-rotation), your client seed, nonce, and the published mapping rule for that game. Save them in a plain text file to avoid transcription errors.
- Tip (TH context): if the UI is localized, ensure separators are exactly as shown (colon vs dash, spaces). Copy/paste instead of typing.
-
Verify the commitment (hash check)
Compute the hash of the revealed server seed using the same algorithm the site states (commonly SHA-256). It must equal the previously shown server seed hash.
- If it doesn't match, stop: that round (or seed cycle) is not verifiable under provably fair rules.
-
Recompute the HMAC/message digest for that exact nonce
Build the message string exactly as documented-often
clientSeed:nonce. Then compute HMAC-SHA256 using the server seed as the key (common convention, but some sites reverse it). -
Map the hex output to the game outcome
Use the game's published extraction method (e.g., take first 8 hex chars → integer → scale to range; or iterate chunks until under a threshold). Your derived outcome must match the recorded result.
-
Cross-check with an independent implementation
Run the same calculation in a second language (or a separate script) to reduce the chance your own code has a bug. This is the safest way to answer "how to verify provably fair results" without relying on the casino's verifier alone.
Reference snippets (offline): commitment + HMAC in JavaScript (Node.js)
// node verify.js
// Usage: node verify.js <serverSeed> <serverSeedHash> <clientSeed> <nonce>
const crypto = require("crypto");
const [serverSeed, serverSeedHash, clientSeed, nonce] = process.argv.slice(2);
if (!serverSeed || !serverSeedHash || !clientSeed || typeof nonce === "undefined") {
console.error("Missing args.");
process.exit(1);
}
// 1) Commitment check (SHA-256 is common; confirm the site's algorithm)
const computedHash = crypto.createHash("sha256").update(serverSeed, "utf8").digest("hex");
console.log("hash matches:", computedHash === serverSeedHash);
// 2) HMAC step (common convention: key=serverSeed, msg=`clientSeed:nonce`)
const msg = `${clientSeed}:${nonce}`;
const hmac = crypto.createHmac("sha256", serverSeed).update(msg, "utf8").digest("hex");
console.log("hmac:", hmac);
// 3) Example extraction placeholder (site-specific!)
// const first8 = hmac.slice(0, 8);
// const intVal = parseInt(first8, 16);
// console.log("first8-int:", intVal);
Reference snippets (offline): commitment + HMAC in Python
# python verify.py
# Usage: python verify.py <serverSeed> <serverSeedHash> <clientSeed> <nonce>
import sys, hashlib, hmac
server_seed, server_seed_hash, client_seed, nonce = sys.argv[1:5]
computed_hash = hashlib.sha256(server_seed.encode("utf-8")).hexdigest()
print("hash matches:", computed_hash == server_seed_hash)
msg = f"{client_seed}:{nonce}".encode("utf-8")
h = hmac.new(server_seed.encode("utf-8"), msg, hashlib.sha256).hexdigest()
print("hmac:", h)
# Extraction is game-specific; implement the exact published mapping next.
CLI quick checks (no custom code)
- SHA-256 commitment (macOS/Linux):
printf '%s' "$SERVER_SEED" | shasum -a 256 - HMAC-SHA256 (OpenSSL):
printf '%s' "$CLIENT_SEED:$NONCE" | openssl dgst -sha256 -hmac "$SERVER_SEED"
What provable fairness cannot prove: attack vectors and limitations
- It doesn't prove the casino's payout model is favorable; a provably fair game can still be -EV by design.
- It doesn't prove the mapping algorithm is unbiased; subtle choices (rounding, thresholds, modulus bias) can shape outcomes.
- If the casino controls the client seed (or resets it silently), your ability to influence randomness is reduced even if results remain verifiable.
- Seed rotation policies can be abused (e.g., forcing a rotation before you can export details), weakening practical verifiability.
- A published server seed hash is meaningless if it was shown only after the bet or if the UI can be manipulated per user session.
- Third-party "providers" can change algorithms between versions; if you can't pin the exact spec, you can't reproduce deterministically.
- Verification says nothing about account-level risks (KYC friction, withdrawal delays, geo restrictions in Thailand context).
- If you can't validate the nonce sequence, you can't rule out "skipped" or "reordered" bets in the displayed history.
Building a verifier: libraries, reproducible tests and common pitfalls
- Swapped HMAC roles: some sites use key=clientSeed and message=serverSeed:nonce; follow the published spec exactly.
- Wrong delimiter/encoding:
clientSeed:noncevsclientSeed-nonce, UTF-8 vs accidental whitespace-one hidden space breaks everything. - Nonce base mismatch: nonce starting at 0 vs 1; confirm by verifying two consecutive rounds.
- Partial hex extraction errors: taking 4 bytes vs 8 hex chars vs 52 bits; implement the same bit/byte boundaries as documented.
- Modulo bias: naive
int % rangecan bias outcomes unless the spec uses rejection sampling; copy the exact approach. - Rounding differences: decimal truncation vs rounding, and fixed precision (e.g., 2 decimals) must match the game's display rules.
- Hash algorithm mismatch: commitment might be SHA-256 while game uses HMAC-SHA256; don't assume they're the same step.
- Not pinning test vectors: create a small set of known seeds/nonces with expected outputs and run them in CI to prevent regressions.
If you're choosing a provably fair verification tool, prefer one that: runs locally, is open source, lets you paste/export raw round data, and documents the exact mapping logic-otherwise you're re-trusting the same party you're trying to verify.
Reading hashes and HMACs: mapping outputs to game outcomes
When the built-in verifier is unclear, these approaches can still help you reproduce results safely and consistently:
- Use the casino's published verifier only as a cross-check: confirm your offline output matches theirs, then rely on your offline method for final verification.
- Re-implement from a spec or open-source reference: best when the game publishes pseudocode for dice/crash/cards and you can write deterministic tests.
- Verify at the "primitive" level first: hash match → HMAC match → outcome mapping. Stop at the first mismatch to isolate whether the issue is commitment, crypto, or mapping.
- Prefer games with explicit round export: if you're evaluating the best provably fair casinos, prioritize those that let you export server seed hash, revealed seed, client seed, nonce, and algorithm version per round.
Verification corner: concise clarifications and edge cases
If my hash matches but the outcome doesn't, is it rigged?
Not necessarily. Most mismatches come from nonce/base errors, swapped HMAC key/message roles, or a missing extra field (round id/cursor). Treat it as "spec mismatch" until you reproduce a second round correctly.
Can a provably fair crypto casino change results after I bet?
If you captured the server seed hash before betting and it later matches the revealed server seed, they can't change the server seed without detection. They still control the algorithm design and the platform behavior around it.
Do I need to trust the built-in verifier page?

No. Use it as a convenience, but your strongest check is offline reproduction with Node.js/Python or known crypto tools. That's the practical answer to "how to verify provably fair results" safely.
Why does changing my client seed matter if the server seed is secret?
Your client seed ensures the final HMAC depends on a value you control, reducing the chance the casino can precompute favorable sequences for a fixed client seed. It doesn't guarantee profit or prevent all manipulations around seed rotation.
What if the casino won't show the server seed until much later?
You can't fully verify a round until the reveal happens. If reveals are delayed indefinitely or round data cannot be exported, practical verifiability is weak even if "provably fair" is advertised.
Are "best provably fair casinos" the ones with the fanciest hash UI?
UI isn't the key factor. The best ones provide complete round data, clear algorithm documentation, consistent nonce rules, and easy seed rotation with downloadable history so you can audit without friction.
What does "provably fair hash and seed explained" mean in one sentence?
The hash is a pre-bet commitment to a secret server seed, and the revealed seed plus your client seed and nonce deterministically reproduce the same HMAC output that maps to the shown result.



