Open Standard · v1.0 · CC-BY-4.0
Verifiable Giveaway Protocol
Published 2026-01-15 · Updated 2026-06-10 · Maintained by Rafflecopter · github.com/rafflecopter/verifiable-giveaway-protocol
Problem
Every screenshot of a Stories-or-Reels giveaway announcement looks identical to a Photoshopped one. Without cryptographic proof, a host can secretly pick a friend, generate a fake screenshot, and post it — and there is no mathematical way for an audience member to detect the substitution. The audience either trusts the host or doesn't. The host has no way to prove fairness even when they are fair.
The Verifiable Giveaway Protocol (VGP) solves this by defining a deterministic algorithm any third party can re-run from public inputs and verify the published winner is the only winner the algorithm could have produced.
3-phase algorithm
Phase 1 — Input normalization
Collect the canonical set: (a) source post URL, (b) fetched comment list sorted alphabetically by lowercased username, (c) draw timestamp in ISO-8601 UTC, (d) winner count N, (e) any exclusion list also sorted lowercased.
input = {
post_url: "https://www.instagram.com/p/<shortcode>/",
comments: sorted([c.lower() for c in comments]),
timestamp: "2026-06-10T14:23:45.000Z",
winner_count: 1,
exclusions: sorted([e.lower() for e in exclusions]),
}Phase 2 — Seed derivation
Concatenate the JSON-canonical serialization of input and feed it to SHA-256. Take the resulting 256-bit hash as the seed of a deterministic CSPRNG (HMAC-DRBG with SHA-256). Use the DRBG to produce a uniform-random permutation of the comment list (Fisher-Yates). Take the first N entries (after applying exclusions) as winners.
seed_hex = SHA256(canonical_json(input)).hex() drbg = HMAC_DRBG(seed=seed_hex) shuffled = fisher_yates(input.comments, drbg) winners = [c for c in shuffled if c not in input.exclusions][:N]
Phase 3 — Publication
Publish the seed_hex, the canonical JSON, and the winners. Anyone can re-run Phase 1+2 from the published JSON and verify the same seed_hex + same winners. A mismatch proves the host tampered with the published winner list.
GET /api/verify/{seed_hex}
→ 200 { canonical_json, winners, verified: true }Mathematical proof
SHA-256 is collision-resistant under standard cryptographic assumptions (NIST FIPS 180-4). HMAC-DRBG is a NIST-approved deterministic random bit generator (NIST SP 800-90A). The composition guarantees:
- Determinism: identical input ⇒ identical output (1 winner per input).
- Uniformity: the CSPRNG produces shuffled positions statistically indistinguishable from a true-random permutation under the random oracle model.
- Tamper-evidence: any change to comments, timestamp, exclusions would yield a different SHA-256 — re-verification fails.
Reference implementation
The Rafflecopter draw engine implements VGP v1.0 verbatim. Source: github.com/rafflecopter/verifiable-giveaway-protocol. Each draw publishes seed_hex on the result page and exposes the verifier at /api/verify/{hash}.
VGP is not a Rafflecopter-only specification. Any giveaway tool can implement it. We maintain a public registry of compliant implementations at /registry/compliant-tools.
License
This specification is released under Creative Commons Attribution 4.0 International (CC-BY-4.0). Free to implement, distribute, modify, and use commercially — attribution required.