6 つの設計原則
サーバーサイドで抽選を完結
当選結果はサーバーが crypto.randomBytes ベースの暗号学的乱数で決定し、API レスポンスとして返します。クライアント (LIFF / ブラウザ) では確率に関与しません。「演出」とは独立したロジックです。
在庫と確率を分離
景品ごとに「在庫数」と「当選確率」を独立に設定。確率は管理者でも履歴を残さずに変えられないよう audit log に記録され、抽選中の改ざんを構造的に防ぎます。
抽選結果をハッシュチェーン化
すべての抽選結果は前のエントリの SHA-256 と連結し、新しい hash として記録します。チェーン全体は (campaignId, chainIndex) で一意。途中の 1 件を書き換えると以降すべての hash が壊れ、検出されます。
改ざん検出 API を公開
/api/v2/audit/chain で誰でもチェーンの整合性を検証できます。第三者・報道機関・税務当局・運営店舗自身が、運営の許可なしに過去のすべての抽選を再計算できます。
景品表示法・特商法に準拠
景品表示法のオープン懸賞要件、特定商取引法の表示義務に準拠した運用テンプレートを提供。賭博性のある「実費負担+金銭価値の高額景品」の構成は規約で禁じています。
マネーロンダリング対策
すべての高額景品 (景品表示法上限を超える換金性のあるもの) は審査対象として記録され、抽選チェーンと突合可能な状態で保持されます。捜査機関からの開示要求にも応じられる体制です。
ハッシュチェーンの構造
各抽選は entryHash = sha256(prevEntryHash + entryPayload) として記録され、チェーン全体が一意の (campaignId, chainIndex) で並べられます。
POST /api/v2/audit/chain
{
"campaignId": "cmp_abcd1234",
"fromIndex": 0,
"toIndex": 9999
}
→ {
"valid": true,
"entries": 8421,
"headHash": "9f3a...",
"tailHash": "1c7d..."
} このエンドポイントは認証不要。第三者・取材機関・運営店舗自身が、運営の同意なしに過去すべての抽選を検証できます。
関連ドキュメント
報道・取材・捜査機関・自治体担当者の方は、開示手順を直接ご案内します。
press@neo-gacha.com