Skip to content
DrawSeal

Check that a draw isn’t rigged.

No blind trust required: you can recompute any DrawSeal draw yourself, in your browser, from public data.

Why this draw is trustworthy

Every draw follows the same verifiable timeline. Here is how, in the order it happens each time.

  1. Before each draw opens, we draw a secret seed and publish its fingerprint, announcing which public source of randomness will be used. We are committed without being able to predict anything.
  2. When entries close, the list of participants is frozen and its fingerprint published. No one can add or remove anyone from it after that.
  3. This fingerprint is immediately submitted to the OpenTimestamps calendars, which anchor it in the Bitcoin blockchain — an independent service, outside our control. We can no longer claim to have frozen it at a different time.
  4. Twenty-four hours later, the randomness is published, produced by an independent international network that no one controls. The winner follows from a calculation anyone can redo.

At no point did we have both the power to change something and the knowledge of what changing it would do.

The 3 proofs you can check

  1. The commitment was published before the draw

    A sha256 fingerprint of the seed and a drand round number are published before the draw. The organizer therefore cannot choose the seed after seeing the participants.

  2. The randomness comes from a public, signed source

    DrawSeal uses drand, a public randomness beacon whose every value is signed (BLS). The verification page checks this signature.

  3. The winner can be recomputed identically

    With the revealed seed + the drand randomness + the (pseudonymous) list of participants, your browser replays the draw. If the displayed winner differs, the fraud is visible.

No personal data (email) is ever exposed: participants appear under a pseudonymous identifier.

Verify it yourself, without trusting us

  1. Before the draw, we publish a closed padlock (a fingerprint) and announce that we will use a number produced by an independent public network, at a precise moment in the future. We cannot open it yet, but it is already there, frozen.
  2. After the draw, we reveal the key that opens this padlock. Anyone can check that this key matches exactly the padlock published beforehand — there is no way we swapped it after seeing who entered.
  3. The random number does not come from us: it is supplied by drand, a public network nobody controls. You can go and fetch it yourself somewhere other than our site, to confirm we did not make it up.
  4. With the key + this public number, anyone can redo exactly the same computation we did and land on the same winner — you do not have to take our word for it, you can check.
Technical details (for developers / audit)
  1. Public data. Served as JSON, without authentication, at /api/public/giveaways/<identifiant-du-giveaway>/verification : the seed fingerprint (serverSeedHash), the targeted drand round, then (after the draw) the revealed seed, the drand beacon and the participant pool (pseudonymous identifiers) with the announced winners.
  2. Commitment. sha256(seed) === serverSeedHash, published before the draw.
  3. Randomness. BLS signature of the drand beacon, verified against the network public key (function verifyBeacon). Independent check: query https://api.drand.sh/52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971/public/<round> directly and compare randomness with the one in the bundle.
  4. Winner of rank r. finalHash = sha256(seed | drand | r | pool_fingerprint), then target = finalHash mod Σweights designates the winning ticket number in the remaining pool (previous ranks removed).

Full algorithm published in the open-source package @drawseal/shared (verifyDraw, verifyBeacon, computeWinners) — reimplementable in any language from the public data above alone.