あるくじの抽選は、運営を信じてもらう代わりに、誰でも自分の手で当選番号を再計算して確かめられる仕組みです。やさしい概念の解説は別記事にありますが、この記事ではその技術的な中身——実際に公開している値と、自分で検証する手順——を説明します。
この記事の位置づけ
「なぜ運営が結果を操作できないのか」をやさしい比喩(封筒を先に渡す)で解説したのが検証可能な抽選の記事です。この記事はその技術編として、実際に公開している値と、検証の具体的な手順に踏み込みます。
抽選の前に固定される「コミットメントハッシュ」
毎回の抽選では、締切の時点で参加者の番号リストが確定します。このリストは「匿名化した参加者ID」と「その番号」の組で作られていて、確定と同時に、リスト全体から SHA-256 というハッシュ関数で「指紋」を計算し、その場で公開します。これをコミットメントハッシュと呼びます。
SHA-256 は、入力が1文字でも変わると出力がまったく別の値になる関数です。先に指紋を公開してしまえば、後からリストをこっそり書き換えることはできません。書き換えた瞬間、公開済みの指紋と合わなくなるからです。加えて、確定後のレコードはデータベース側のルール(アクセス制御と変更禁止のトリガー)で書き換え自体を拒否しています。
抽選に使う数字の作り方
当選番号は、ある1つの数字から計算で決まります。この「抽選に使う数字」は、次の式で決まります(公開データでは random_seed という名前で載せています)。
- 抽選に使う数字 = SHA-256(コミットメントハッシュ + ":" + 公開乱数の値)
公開乱数には drand(ドランド) という国際的な公開乱数サービスの値を使います。drand は世界中の複数組織が共同運営し、一定間隔で誰にも予測できない乱数を発行し、誰でも取得できます。drand の値には「ラウンド」という通し番号があり、30秒ごとに1つずつ発行されます。あるくじが使うのは「抽選時刻(参加者の確定が抽選時刻より遅れた回は確定時刻)より後に発行される最初のラウンドの randomness」で、この決め方をあらかじめ公表しています。どのラウンドを使うかは時刻から計算で一つに決まり、抽選をいつ実行し直しても変わりません。しかもそのラウンドは参加者の一覧が確定した後に発行されるので、運営にも前もってはわからず、都合のいい結果になる乱数を選ぶ余地がありません。使うラウンドの番号は抽選前から、実際に使った値は抽選後に、検証ページで公開します。
ラウンドの番号は、次の式で誰でも計算できます(drand の default チェーン: genesis_time = 1595431050、period = 30秒)。
- 基準時刻 t = max(予定抽選時刻, 参加者の確定時刻)
- ラウンド r = floor((t − genesis_time) / period) + 2
ラウンド r の発行時刻は genesis_time + (r − 1) × period で、必ず t より後になります。
こうして決まった数字から乱数列を作り、参加者の実番号の中から当選番号(本賞)と追加の当選番号を順番に抽出します。
検証ページで公開している値
検証ページ(/verify)では、毎回の抽選について次の値を公開しています。
- コミットメントハッシュ(締切時のリストの指紋)
- 使った drand のラウンド番号と、その値(公開乱数)
- 抽選に使う数字(上の式で計算された値・
random_seed) - 当選番号(本賞)と、追加の当選番号
これらがそろっているので、第三者が同じ計算を再現できます。
自分で検証する5ステップ(技術に詳しい方向け)
プログラムに詳しい方なら、ご自身のパソコンで次のように確かめられます。
- 公開された参加者リストを取得し、SHA-256 を計算する → 公開済みのコミットメントハッシュと一致するか確認
- 上の式で使うラウンド r を計算し、検証ページに載っているラウンド番号と一致するか確認する
- drand の公式サーバー(
https://api.drand.sh/<chain hash>/public/<r>)からラウンド r の値を取得し、検証ページの drand 値(R)と一致するか、ラウンド r の発行時刻が参加者の確定時刻より後かを確認する - 抽選に使う数字 = SHA-256(ハッシュ + ":" + R) を自分で計算する
- 公開されている抽選コードで同じ抽出を実行し、当選番号が発表と一致するかを確認する
抽選コードは検証ページからたどれる形で公開しています。すべてのステップが公開情報だけで再現できるので、途中でごまかしがあれば計算が合わなくなり、誰かが必ず気づけます。
技術に詳しくない方も、「確かめられる状態で公開されている」こと自体が抽選の正しさの担保になります。手を動かせる人が世界に一人でもいれば、不正はいずれ露見するからです。
なぜ、ここまで公開するのか
懸賞アプリに対する一番の不安は「本当に公正に抽選しているのか」だと、運営として考えています。だからあるくじは、「信じてください」と言う代わりに、信じなくても確かめられる形を選びました。透明性は、あとから足す機能ではなく、最初から設計の中心に置いています。
まとめ
- 締切時にリストの**コミットメントハッシュ(SHA-256)**を公開 → 後から書き換え不可。
- 抽選に使う数字は SHA-256(ハッシュ + drandの公開乱数) で決まる → 運営が結果を選べない。
- 検証ページでハッシュ・drand値・抽選に使う数字・当選番号を公開 → 誰でも再計算して検証可能。
- 手順はすべて公開情報だけで再現できる = ごまかせば必ず気づける構造。
概念のやさしい解説は検証可能な抽選、抽選や賞金の全体像はあるくじの仕組みからどうぞ。実際の公開値は検証ページで確認できます。