Serverless & Stateless
Sound: ON

QUACK RUNNER CONTROL CENTER

Configure and launch your provably fair duck race

0 Ducks

Standings

No active race. Start a race to see real-time 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!