Tournament

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

  1. 1When your session opens, the server generates a random 32-byte seed and shows you its SHA-256 commitment before the first serve.
  2. 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.
  3. 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.
  4. 4The bot itself is deterministic and version-pinned. Its only randomness is the committed seed; your paddle inputs are recorded tick by tick.
  5. 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.