Provably fair
Every session commits to its randomness before you play. The bot is a fixed, versioned policy whose serve angles and aim noise come only from a seed committed up front, so nothing adapts to how you play.
Commit and reveal, per session
- 1When your session opens, the server generates a random 32-byte seed and shows you its SHA-256 commitment before the first serve.
- 2Every serve angle and every piece of bot aim noise is drawn from HMAC-SHA256 of the session ID, your client seed, the rally number, and a draw counter, keyed by that seed.
- 3The digest is read as 4-byte windows. The first value below 4,294,000,000 is accepted by rejection sampling, so every draw is exactly uniform.
- 4The bot itself is deterministic and version-pinned. Its only randomness is the committed seed; your paddle inputs are recorded tick by tick.
- 5When the session closes, the seed is revealed. You can check that it hashes to the commitment you saw, and replay every draw.
Algorithm
commitment = SHA-256(sessionSeed) message = pong|v1|sessionId|clientSeed|rally:n|draw:i|purpose digest = HMAC-SHA256(sessionSeed, message) uniform = first 4-byte window < 4,294,000,000, mod 1,000,000 serve, noise = table lookups from uniform
Verify a session
Paste a session ID to load its recorded proof, hash the revealed seed against the commitment, redraw the serves, and replay every settled rally in your browser.
