Verifiable Randomness Systems
Randomness systems fail most often because of timing.
Specifically:
Who knew what — and when?
If an operator can see an outcome before locking their input, they can influence the result.
Commit–reveal exists to eliminate this advantage.
Commit–reveal is a two-step protocol:
The commitment is binding but hiding.
That means:
This prevents outcome-dependent manipulation.
Imagine writing a number on paper.
If the number matches what’s inside:
You could not have changed it after seeing the result.
That’s commit–reveal.
In software, commitments are usually hashes.
Example:
Secret: server_seed Commitment: hash(server_seed)
The hash is published before the outcome.
Later, the secret is revealed.
Anyone can verify:
hash(revealed_secret) == published_commitment
If it matches, the commitment was honest.
Without commit–reveal, an operator can:
Even with a good RNG, this is manipulation.
Commit–reveal locks the operator before the outcome is known.
A correct commit–reveal scheme guarantees:
It does not guarantee that the value was chosen fairly.
That’s a critical distinction.
A system can use commit–reveal and still be unfair.
Why? Because fairness also requires:
Commit–reveal prevents changing inputs, not choosing bad inputs.
Typical provably fair setup:
Verification recomputes everything.
The most important rule:
All commitments must be made before any outcome-influencing data is known.
Violations include:
Any of these break fairness.
A commitment that is never revealed is useless.
Bad pattern:
Commit published → Outcome unfavorable → Reveal “delayed” or skipped
This allows selective disclosure.
A fair system must enforce:
In stronger systems:
As long as one party is honest, the outcome remains fair.
Used in:
Using the same committed seed for multiple rounds:
Each round must have a fresh commitment.
Low-entropy secrets:
Commitments must hide the value completely.
Conditionally committing based on user behavior:
Commitment must be unconditional.
Commit–reveal answers:
“Could the input have been changed?”
Deterministic replay answers:
“Could the outcome have been different?”
You need both for provable fairness.
One without the other is insufficient.
A verifier should be able to confirm:
If any step fails, fairness is broken.
A user should be able to:
Without contacting support.
That is the standard.
Commit–reveal is about locking intent in time.
It prevents:
But it only works when combined with:
Provable fairness begins with commitment — but it is proven through replay.