Standings
Provably Fair Auditor
You can verify that the outcome of any race was determined strictly by the seeds and was not manipulated by the server or client. Paste the parameters of any race below and run the audit. The verification is calculated entirely inside your browser.
Your Local Race History
| Race ID | Winner | Ducks | Client Seed | Completed At | Action |
|---|---|---|---|---|---|
| No races in your history yet. Complete a race to save it here! | |||||
How Quack Runner Works
Quack Runner is a provably fair racing simulator. This page explains how the cryptography keeps it transparent and how the physics engine determines the winner.
1. The Provably Fair Protocol
Provably fair means the outcome of a race is pre-determined before it starts, and you can verify that the server did not change or rig the result.
Step 1: Server Commitment
The server generates a secret random string (Server Seed) and hashes it using SHA-256 to create a Commitment Hash. This hash is shown to you before you start. Because the hash is public, the server is locked into its choice and cannot change it later.
Step 2: Client Seed Input
You provide your own custom text or generate a random phrase (Client Seed). This adds your own randomness to the generator, making it mathematically impossible for the server to know or manipulate the outcome in advance.
Step 3: Locked Input & Reveal
When you click start, all inputs are frozen. The server reveals the original Server Seed. The client combines them with the unique Race ID:
Combined Seed = Server Seed + ":" + Client Seed + ":" + Race ID
Step 4: Audit Verification
You can run the audit locally inside the Fairness Auditor. It runs the exact same open-source physics engine with the Combined Seed and checks if the winner and duration match the server output perfectly.
2. The Deterministic Physics Engine
The movement of the ducks is calculated inside a physics engine that is completely stateless and deterministic. This means that for a given seed, the race will play out exactly the same way every time.
PRNG Seed Derivation
We hash the combined seed using cyrb128 to produce 4 32-bit integers, which initialize a high-quality SFC32 Pseudo-Random Number Generator. This PRNG generates random values for speed, current offsets, and boosts.
River Currents & Ticks
The simulation runs at a fixed 60 ticks per second (60Hz) for exactly 1 minute. Each tick, the engine applies forward velocity, river turbulence, and side-to-side current drift to each duck.
Boosts & Stuck States
Ducks have a small probability of catching a fast current (BOOST, displaying a speech quack and water spray trails) or getting caught behind a rock (STUCK), adding dramatic shifts to the leaderboard.
Catch-Up (Rubber-Banding)
To keep races close and exciting, a rubber-banding algorithm adjusts each duck's speed relative to the group's average position. If a duck falls far behind, it gains speed; if it pulls too far ahead, it slows slightly. This is disabled during the final 10% of the race, allowing a true winner to break out!