Transparency
How Our Competitions Work — and How You Can Verify Them
Every competition on this platform is backed by certified quantum hardware randomness and a published cryptographic record. This page explains what that means, how winners are selected, and how you can independently confirm — using your own computer — that any competition result is genuine.
You don't have to take our word for it. The maths is open, the tools are free, and the verification requires no special skills beyond running a command in a terminal.
The Short Version
The Randomness Source
Randomness in computing is surprisingly hard to do well. Software algorithms can appear random but are ultimately deterministic —given the same starting state, they produce the same sequence. That's not good enough for a fair draw.
Our platform uses a dedicated ID Quantique Quantis PCIehardware quantum random number generator. This device produces genuine randomness from quantum optical processes: it measures the behaviour of individual photons, which is fundamentally unpredictable by the laws of physics — not just "hard to predict", but provably without a hidden pattern. No algorithm, no seed, no back-door.
The device's serial number is printed on every draw certificate. This lets you confirm which physical hardware unit was used for each draw.How Winners Are Selected
Step 1 — Entropy is reserved
Step 2 — A commitment is made
This hash is published as part of the result. Because SHA-256 is a one-way function, the only way to produce the same hash is to have the exact same inputs. The commitment proves the seed was fixed before selection began — it is mathematically impossible to swap the seed for a different one without the hash changing.
Step 3 — Winners are drawn
Step 3b — Alternates are drawn (if requested)
Step 4 — The transcript is sealed
Step 5 — The certificate is issued
Reading the Draw Certificate
The PDF certificate issued after each draw contains the following fields:
| Field | What it means |
|---|---|
| Draw ID | A unique identifier for this specific draw |
| Reference | A label set by the draw organiser (e.g. competition name) |
| Drawn At | The exact UTC timestamp when the draw was executed |
| Total Entries | The total number of entries in the pool |
| Number of Winners | How many winners were drawn |
| Number of Alternates | How many alternates were drawn (omitted if zero) |
| RNG Source | Always 'Quantis PCIe Hardware QRNG' — the hardware device used |
| RNG Serial | The serial number of the specific hardware unit |
| Discarded Samples | How many random values were discarded for bias prevention (see below) |
| Commitment Hash | SHA-256 hash computed from the draw parameters and seed before the draw |
| Reveal Seed | The 32-byte quantum entropy seed (shown as 64 hexadecimal characters) |
| Transcript Hash | SHA-256 hash of the complete draw operation log |
| Winners | The selected entry numbers, in draw order |
| Alternates | Alternate entry numbers drawn after winners (omitted if none were requested) |
Why are there three hashes?
- Commitment hash — proves the seed was locked in before selection. If you hold this hash from before the draw, you can verify the seed was not chosen after the outcome was known.
- Reveal seed — the raw quantum entropy. Feeding this into the verifier replays the entire draw from scratch and produces the same winners.
- Transcript hash — proves every operation happened in the recorded order. Changing any winner, or changing their sequence, breaks this hash.
Verifying a Draw Yourself
Download the verifier
| Language | Requirement | Download |
|---|---|---|
| Go | Go 1.21+ | Download verify.go |
| Python | Python 3.6+ | Download verify.py |
| JavaScript | Node.js 18+ | Download verify.js |
Python and JavaScript verifiers use only their standard libraries — no package installation needed.
Install
Go
# Unzip the downloaded archive, then: go build -o qrng-verify ./verify.go # Move to somewhere on your PATH if you like: mv qrng-verify /usr/local/bin/Python — no installation required:
python3 verify.py --helpJavaScript — run with Node.js:
node verify.js --helpRunning a Verification
Arguments
If you omit --commitment-hash , --transcript-hash , or
--winners
, those checks are skipped and the tool simply prints the computed
values.
Example
Python:
python3 verify.py \ --draw-id "summer-prize-draw-2026" \ --total-entries 8500 \ --number-of-winners 5 \ --reveal-seed "9f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" \ --commitment-hash "c8d4f3e9a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6" \ --transcript-hash "d7c6b5a49382f1e0c9d8b7a6f5e4d3c2b1a0f9e8d7c6b5a4938271f0e9d8c7b6" \ --winners "7823,412,5901,3367,88"`}JavaScript:
{`node verify.js \ --draw-id "summer-prize-draw-2026" \ --total-entries 8500 \ --number-of-winners 5 \ --reveal-seed "9f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" \ --commitment-hash "c8d4f3e9a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6" \ --transcript-hash "d7c6b5a49382f1e0c9d8b7a6f5e4d3c2b1a0f9e8d7c6b5a4938271f0e9d8c7b6" \ --winners "7823,412,5901,3367,88"Go:
qrng-verify \ --draw-id "summer-prize-draw-2026" \ --total-entries 8500 \ --number-of-winners 5 \ --reveal-seed "9f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" \ --commitment-hash "c8d4f3e9a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6" \ --transcript-hash "d7c6b5a49382f1e0c9d8b7a6f5e4d3c2b1a0f9e8d7c6b5a4938271f0e9d8c7b6" \ --winners "7823,412,5901,3367,88"Expected output:
=== Draw Verification === Draw ID: summer-prize-draw-2026 Total Entries: 8500 Number of Winners: 5 Reveal Seed: 9f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2 Commitment Hash: c8d4f3e9a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6 Transcript Hash: d7c6b5a49382f1e0c9d8b7a6f5e4d3c2b1a0f9e8d7c6b5a4938271f0e9d8c7b6 Discarded Samples: 0 Winners (0-idx): 7823,412,5901,3367,88 ✓ commitment_hash MATCH ✓ transcript_hash MATCH ✓ winners MATCH Verification PASSED.
Example — with alternates
--number-of-alternates and --alternates alongside the standard arguments.
Suppose your certificate shows:
Draw ID: summer-prize-draw-2026
Total Entries: 8500
Number of Winners: 5
Number of Alternates: 3
Reveal Seed: 9f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2
Commitment Hash: a1e4f7b2c5d8e3f096a2b1c4d7e0f3a6b9c2d5e8f1a4b7c0d3e6f9a2b5c8d1e4
Transcript Hash: f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2
Winners (0-indexed): 7823, 412, 5901, 3367, 88
Alternates (0-indexed): 2204, 6711, 1055
Python:
python3 verify.py \ --draw-id "summer-prize-draw-2026" \ --total-entries 8500 \ --number-of-winners 5 \ --number-of-alternates 3 \ --reveal-seed "9f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" \ --commitment-hash "a1e4f7b2c5d8e3f096a2b1c4d7e0f3a6b9c2d5e8f1a4b7c0d3e6f9a2b5c8d1e4" \ --transcript-hash "f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2" \ --winners "7823,412,5901,3367,88" \ --alternates "2204,6711,1055"JavaScript:
node verify.js \ --draw-id "summer-prize-draw-2026" \ --total-entries 8500 \ --number-of-winners 5 \ --number-of-alternates 3 \ --reveal-seed "9f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" \ --commitment-hash "a1e4f7b2c5d8e3f096a2b1c4d7e0f3a6b9c2d5e8f1a4b7c0d3e6f9a2b5c8d1e4" \ --transcript-hash "f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2" \ --winners "7823,412,5901,3367,88" \ --alternates "2204,6711,1055"Go:
qrng-verify \ --draw-id "summer-prize-draw-2026" \ --total-entries 8500 \ --number-of-winners 5 \ --number-of-alternates 3 \ --reveal-seed "9f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2" \ --commitment-hash "a1e4f7b2c5d8e3f096a2b1c4d7e0f3a6b9c2d5e8f1a4b7c0d3e6f9a2b5c8d1e4" \ --transcript-hash "f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2" \ --winners "7823,412,5901,3367,88" \ --alternates "2204,6711,1055"Expected output:
=== Draw Verification === Draw ID: summer-prize-draw-2026 Total Entries: 8500 Number of Winners: 5 Number of Alternates: 3 Reveal Seed: 9f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2 Commitment Hash: a1e4f7b2c5d8e3f096a2b1c4d7e0f3a6b9c2d5e8f1a4b7c0d3e6f9a2b5c8d1e4 Transcript Hash: f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2 Discarded Samples: 0 Winners (0-idx): 7823,412,5901,3367,88 Alternates (0-idx): 2204,6711,1055 ✓ commitment_hash MATCH ✓ transcript_hash MATCH ✓ winners MATCH ✓ alternates MATCH Verification PASSED.
If your certificate shows 1-indexed winners and alternates
Some draws display entries numbered from 1 (where 1 = the first
entry in the pool). If the certificate says "1-indexed",
add
--one-indexed
and pass both winners and alternates exactly as printed on the
certificate — the flag applies to both lists:
Exit codes
| Code | Meaning |
|---|---|
| 0 | Verification passed |
| 1 | A hash, winner, or alternate did not match — the result should be queried |
| 2 | A required argument was missing or invalid |
What the Verification Proves
Running the verifier and seeing
Verification PASSED
confirms three things:
- The seed was fixed before the draw. The commitment hash matches, which means the 32-byte quantum seed was locked in — along with the draw parameters — before any winner was selected. No one could have seen the outcome and then chosen a different seed.
- The exact draw algorithm was followed. The transcript hash matches, which means the recorded sequence of operations produced these exact winners and alternates. Swapping any winner or alternate, or reordering them, produces a different transcript hash.
- The winners and alternates came from genuine randomness. The seed is 32 bytes of certified hardware quantum entropy. The verifier replays the selection from that seed and arrives at the same winners and alternates — meaning no alternative list is consistent with this seed.
Technical Details
Seeded RNG
Eliminating modulo bias
Selecting a random integer in
[0, max)
by computing
r % max
on a uniformly distributed 32-bit value introduces a small bias
unless
max
divides
2^32
exactly. Our implementation removes this bias with rejection
sampling:
Only values below
limit
are accepted, so every outcome in
[0, max)
has exactly the same probability. The number of discarded values is
reported on the certificate as
Discarded Samples
and is usually zero. For draws with up to 100 million entries, the
expected discard rate is under 0.01%.
Selection without replacement
Commitment construction
Transcript format
| Prefix | Payload | Meaning |
|---|---|---|
| 0x10 | 4-byte length + UTF-8 bytes | Draw ID string (first record) |
| 0x01 | 4-byte big-endian uint32 | RNG sample, accepted value, or parameter |
| 0x02 | 4-byte big-endian uint32 | Confirmed winner index |
| 0x03 | 4-byte big-endian uint32 | Confirmed alternate index |
| 0xff | (none) | Rejected sample (bias discard) |
