検証

すべての懸賞の抽選はどのように検証できるか

抽選が公正であるのは、主催者も私たちも含め、誰も当選者を選んだり予測したりできない場合だけです。GetSocialExport がどのように当選者を抽選し、誰でも証明書から抽選を検証できるのかを、ここで正確に説明します。

抽選の4つのステップ

  1. 参加者リストが確定されます。主催者の拡張機能がコメントを収集し、懸賞のルールを適用して、対象となる参加者のリストを当社のサーバーに送信します。リストは固定された順序に並べられ、その SHA-256 フィンガープリントが時刻とともに記録されます。それ以降、名前を1つ変えるだけでフィンガープリントが変わってしまいます。
  2. 未来の乱数が選ばれます。その時点でサーバーは、約 30 秒後にようやく公開される drand ラウンドを選びます。drand は League of Entropy(Cloudflare、Protocol Labs、大学など)が運用する公開乱数ビーコンです。その数値は予測も操作もできず、それぞれに誰でも検証できる署名が付いています。
  3. 当選者が計算されます。ラウンドが公開されると、懸賞コード、抽選番号、リストのフィンガープリント、乱数からシードが作られます。当選者はそのシードから SHA-256 を使って偏りなく選ばれ、ルールで定められたボーナスチケットを持つ参加者だけに追加の重みが与えられます。
  4. すべてが公開されます。証明書には、当選者、フィンガープリント、ラウンド、シード、リストが確定された時刻、理由を添えたすべての再抽選、そして(主催者が非公開にしていない限り)参加者リスト全体が表示されます。

証明書で確認できること

任意の証明書を開く(QRコードを読み取る)と、ブラウザが私たちを信頼することなく自分で検証します。

  • 公開された参加者リストが、抽選前に記録されたフィンガープリントと一致すること。
  • 乱数が drand 由来で、League of Entropy による有効な BLS 署名が付いていること。
  • リストがその乱数の存在より前に確定されていたこと。
  • 抽選を再計算するとまったく同じ当選者になること。

また、主催者がリストを非公開にしている場合でも、参加しましたか? に自分の名前を入力すれば、自分が抽選に含まれていたことを確認できます。

証明書が証明しないこと

抽選そのものは証明可能な形で公正です。証明書は、主催者が妥当なルールを適用したことや賞品を渡したことまでは証明できません。参加者リストは主催者自身の拡張機能から得られるものであり、だからこそ参加者が確認できるように公開され、だからこそすべての再抽選がその理由とともに表示されます。

技術的な詳細

  • アルゴリズム: socialexport-draw-v1。正規化リスト: 参加者ごとに1行、id⇥名前⇥チケット、id 順にソートし、改行で連結。フィンガープリント = そのテキストの SHA-256。
  • 乱数: drand ネットワーク quicknet、チェーン 52db9ba70e0cc0f6…、3 秒ごとに1ラウンド、G1 上の BLS 署名(RFC 9380)。
  • シード: アルゴリズム名、懸賞コード、抽選番号、リストのフィンガープリント、ラウンド、乱数を改行で連結したものの SHA-256。
  • 抽選: SHA-256(シード ‖ カウンター) で64ビットの数値を生成。範囲の最大の倍数を超える値は棄却(剰余バイアスなし)。抽選のたびに当選者とそのチケットを取り除きます。
  • 証明書は、各リストがいつ記録されたかを証明するために当社のサーバー(ECDSA P-256)が署名します。 公開鍵: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQdshCP/QsGG2k29W80CHSmWbwYpBNgrrIjTf0qPyQuB8cXXLxsCRaty97SO44XaM3aYr6PMwI4dYc/MnSQ3/aw==

検証可能な懸賞を自分で開催する →