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