What is random in a duel?
Peek Duel is a game of skill: whether you hit depends on where you aim and how well you read the conditions. The only seed-driven elements are the map layout and theme, the weather (wind, humidity, fog) and the scope sway pattern — and both players face the same conditions on mirrored bases. That randomness comes from a match seed, and the commit-reveal scheme proves that nobody chose or changed that seed to favour one side.
How commit-reveal works
- Commit. Before the match the server generates a secret random
serverSeedand sends both players its hash:commit = sha256(serverSeed). From this moment the server is locked in — it can't swap the seed without the hash changing. - Client seeds. Each player's app generates its own random
clientSeedand sends it to the server. Neither the server nor the opponent can predict it in advance. - Match seed. The seed that drives the match is
matchSeed = sha256(serverSeed:clientSeedA:clientSeedB). - Reveal. After the match the server reveals
serverSeed. Anyone can check thatsha256(serverSeed)equals the commit and recomputematchSeed.
commit = sha256(serverSeed) // shown before the match
matchSeed = sha256(serverSeed + ":" + clientSeedA + ":" + clientSeedB)
// after the match: serverSeed is revealed → anyone can recompute both hashes
Why this is fair: the server commits to its seed before it sees the players' seeds, so it can't pick a favourable pattern; the players add their own entropy, so the server can't pre-compute the outcome; and the opponent never sees your seed in advance.
How to verify a match
- Open the match in your match history in the Mini App and copy its fair-play data:
commit,clientSeedA,clientSeedBand the revealedserverSeed. - Compute
sha256(serverSeed)and compare it with the commit you received before the match. They must be identical. - Compute
sha256(serverSeed:clientSeedA:clientSeedB)to get the match seed.
Use the verifier below, or any SHA-256 tool. Values are hashed as UTF-8 text exactly as shown, joined with a colon, with no spaces or trailing newline.
# Linux / macOS
printf '%s' 'SERVER_SEED' | sha256sum
printf '%s' 'SERVER_SEED:CLIENT_SEED_A:CLIENT_SEED_B' | sha256sum
# Python 3
python3 -c "import hashlib,sys;print(hashlib.sha256(sys.argv[1].encode()).hexdigest())" 'SERVER_SEED'
# Node.js
node -e "console.log(require('crypto').createHash('sha256').update(process.argv[1]).digest('hex'))" 'SERVER_SEED'
Verifier
Everything is calculated locally in your browser — nothing is sent anywhere.
Authoritative server
- Your app sends only inputs — moves, crouch, aim and fire. Ballistics, block destruction, damage and the result are calculated by the server, never by the client.
- The server simulates every turn deterministically at 20 ticks per second, so the same shot in the same conditions always has the same result — and every match can be replayed exactly.
- While your opponent is hidden behind blocks, their position is not sent to your device — there is nothing for a wallhack to read.
- Inputs are validated: impossible aim speeds, out-of-order packets and abnormal input rates are rejected.
- A full replay of every match is stored for dispute resolution.
Anti-cheat and anti-collusion
- Behavioural analysis looks for bots and aim scripts: inhuman reaction times, robotic aim paths, abnormal headshot ratios for a given rating, suspicious win rates.
- Random matchmaking only in money duels — you can't pick who you play against.
- Accounts that share a device, network or wallet are never matched against each other for money.
- Passive-play detection catches players who deliberately miss or stand in the open to hand over a pot (chip dumping).
- One Telegram account = one game account; multi-accounting is detected and banned.
- Suspicious accounts are removed from money play and their withdrawals are frozen pending a manual review.
The house never plays against you
- There are no house bots in money modes — every opponent is a real player.
- Weapons and parameters are identical for both players in money modes — no pay-to-win.
- The platform earns only a fixed rake — 8% in duels and 10% in tournaments — so it has no interest in who wins.