Mechanics
The list seal: proving nothing changed without publishing the entrants
A draw your entrants can recompute themselves
Seed published before the draw, public drand randomness, shareable video. Free for entrants.
Create an accountVerify an existing drawTwo requirements appear to conflict. For a draw to be demonstrable, you must prove the entrant list hasn't moved. To respect the GDPR, publishing that list is out of the question. The seal resolves the contradiction, and how it does so is the most elegant part of the mechanism.
Why sealing is necessary
The seed fingerprint and the announced drand round close two doors. A third remains, and it is the widest: the list itself.
As long as it can change, the first two commitments guarantee nothing. Adding or removing an entry after seeing the result is enough to change the winner without contradicting any published fingerprint. The computation has three inputs; freezing two is pointless if the third stays free.
What a Merkle root is
It is a fingerprint of a whole set, built in layers. Each entry becomes a leaf; leaves are hashed in pairs, then the results in pairs, up to a single value: the root.
Two properties follow:
- any modification changes the root. Remove an entry, add one, alter a single one: the published root stops matching, and this is immediately apparent;
- membership of a leaf can be proven without showing the others. That is what distinguishes a Merkle root from a plain file hash.
What a leaf contains, and what it doesn't
The point that settles the GDPR question is here: leaves carry no personal data. They contain a pseudonymous identifier and a weight. No email address, no name, no IP.
Direct consequence: the published seal reveals nothing about anyone. It is publishable without restriction, since it says neither how many people are called what, nor who entered — only that a given set, reduced to pseudonyms, hasn't changed.
This design has a valuable side effect. An entrant requesting erasure after the draw is satisfied without the seal becoming false: the personal data attached to the identifier is deleted, and the identifier remains in a tree that contained nothing else.
The inclusion proof
An entrant wants to confirm they were in the pool. They are given an inclusion proof: the sequence of sibling fingerprints needed to climb from their leaf to the published root.
If they redo that path and arrive at the root, two things are established: they were in the list, and the list is the one that was sealed. They gain that certainty without anyone showing them the other entrants.
The ordering invariant
The seal is published when entries close, before the drand round used exists. This is verified by the same integer comparison as before:
`sealRound < drawRound`
The full chain then reads: the list can no longer change without the root ceasing to match; the randomness was not knowable when it was frozen; the result is therefore already determined at sealing time, and nobody — not even whoever holds the seed and the database — can know which one.
Key takeaways
Publishing the entrant list is out of the question; publishing its fingerprint is not. The Merkle root changes on the slightest addition, removal or edit, and lets an entrant prove they were in it without seeing the others. Leaves contain only pseudonyms: the seal therefore stays valid even after an entrant's data is erased. It is published at closing, before the randomness used exists.
FAQ
What happens if the root doesn't match on verification?
The draw is invalid. As with the seed fingerprint, the check is binary and not open to argument: the values match, or they don't.
Can an entrant discover the others from the seal?
No. The root is a single value, and an inclusion proof reveals only intermediate fingerprints, from which nothing can be recovered. Even collecting several proofs doesn't yield the list.
What about entries arriving after closing?
They aren't in the seal, therefore not in the draw. That is what closing means, and it is announced before entries open.
Why a weight on each leaf?
Because a giveaway may include weightings announced in advance — extra chances for a given action, say. The weight is part of what is sealed: it cannot be adjusted afterwards.