🛡️ 無限賞公平性驗證
這個頁面公開所有「無限賞」抽獎的密碼學證明。 不需要相信我們 — 你可以親自用瀏覽器驗證:
✓ 機率不可偷改
每天 commit hash 寫入 immutable D1 table,SQLite trigger 物理擋 UPDATE/DELETE
✓ Server 不可挑結果
抽獎用 HMAC-SHA256 deterministic random,玩家事後可重算驗證
✓ 抽獎紀錄不可篡改
每筆 audit chain hash 串接,改一筆會讓後續全部驗證失敗
📋 演算法都是業界標準(SHA-256 / HMAC-SHA256,跟比特幣 / Cloudflare TLS 同款)。 下方有「在瀏覽器當場驗算」工具,你可以親自用 Web Crypto API 重算每一筆抽獎,完全不需要信任我們的 server。
載入中…
📜 第一層:當日機率 Commit Hash
每天該卡池的機率分布在當日 00:00 UTC 抽出第一筆時自動 snapshot 並寫入
immutable table。admin 之後改機率不會影響當天 hash —
想偷改的話,明天的 hash 才會變,玩家可看出來。所有歷史 hash 透過
previous_hash 鏈狀串接,篡改任何一筆會讓後續全部驗證失敗。
當日 commit hash
—
串接前一日 hash
—
chain 任何一筆篡改會破壞後續全部
該日機率分布快照
| Tier | Prize ID | Prize 名 | 機率 (within tier) |
|---|
🔐 第二層:可驗證隨機 (HMAC commit-reveal)
每天 server 產 256-bit 隨機 seed,立即公開
SHA-256(seed) hash。
seed 24 小時後 reveal。reveal 之後玩家可重算
HMAC-SHA256(seed, account + ":" + draw_no)
得到跟當時抽獎完全一樣的 random 整數 → 證明 server 沒重算 / 沒挑你的結果。
Seed Hash (立即公開)
—
Seed 揭曉狀態
未揭曉
Raw Seed (已揭曉,可驗證)
—
用此值套 HMAC-SHA256 重算每筆抽獎
📊 第三層:當日抽獎統計
當日總抽獎數
0
含所有玩家全部 endless 抽獎
不同獎品命中數
0
統計顯著性需 ≥ 1000 抽
當日獎品命中分布
| Prize ID | Prize 名 | 命中數 | 實際命中率 | 理論機率 | 偏差 |
|---|
Audit Chain (前 100 筆)
每筆抽獎含
previous_hash + row_hash。
row_hash = SHA-256(previous_hash + ":" + canonical_data)。
chain 中任一筆被改 → 後面全部 hash 不對 → audit 自動偵測。
| # | User Hash | HMAC Random | Prize ID | Factor | Row Hash |
|---|
🔬 自己驗算工具(瀏覽器當場跑)
不需要信任我們的 server — 你可以在這裡用瀏覽器自己跑 HMAC-SHA256
算出該抽的 random number,然後跟上方 audit chain 比對。
seed reveal 後(24h 後)任何人可貼 raw_seed + 你的帳號 + draw_no 驗算。
seed reveal 後(24h 後)任何人可貼 raw_seed + 你的帳號 + draw_no 驗算。
純前端 Web Crypto API,沒打 server
對照表:你算出的 hmac_random_int 應該跟 audit chain 同一行的數字一模一樣。
如果不一樣 — 代表 server cheat 或 audit chain 被竄改,立即截圖留證並聯絡客服。
原始演算法 (in pseudo-code):
原始演算法 (in pseudo-code):
message = your_account + ":" + draw_no hmac_hex = HMAC-SHA256(raw_seed, message) hmac_random_int = parseInt(hmac_hex.slice(0, 8), 16) // 取前 32 bit
🔗 驗證整條 Audit Chain 完整性
除了驗單筆 HMAC(上方),也可以驗整條 audit chain 的鏈接完整性。
每一筆 audit row 的
瀏覽器當場跑完整條 chain 驗算 — 不用信任任何 server response。
rowHash 都是由
SHA256(previousHash + ":" + canonical(row)) 算出。
如果 server 偷塞 / 修改 / 刪除任何一筆,下一筆的 rowHash 就對不起來。瀏覽器當場跑完整條 chain 驗算 — 不用信任任何 server response。
用上方載入的 chain 跑 SHA-256 重算每一筆 rowHash
🎯 驗 Prize 選擇是否照 Snapshot 機率
最強驗證 — 抓 server 偷改機率。
server 抽獎時 SHOULD 用 commit 凍結的機率表算 prize(snapshot 內的 probability)。
如果 admin 中午偷改機率讓玩家中不到,audit 會記錄到「以新機率算出的 prize_id」,
但 commit hash 仍是早上的。
這個驗算工具:對每筆 audit row,用
⚠ 只能驗純抽(無 boost / 無 reroll coupon 調整)— 那些有 sampling adjustment 的 row 會跳過 + 標 ⏭️。
這個驗算工具:對每筆 audit row,用
snapshot 的機率表 +
audit 的 hmacRandomInt 重算「應得 prize_id」,
跟 audit 記錄的 prize_id 比對。⚠ 只能驗純抽(無 boost / 無 reroll coupon 調整)— 那些有 sampling adjustment 的 row 會跳過 + 標 ⏭️。
用 snapshot probabilities 重算每筆抽獎應得 prize
📅 跨日 Commit Chain 完整性
每天的 probability commit 都帶
這個工具往回讀 N 天,驗證
previousHash 指向前一天的
snapshotHash。如果 server 偷改某天的機率設定,
那天之後所有 commit 的 chain link 都會斷。這個工具往回讀 N 天,驗證
commit[D].previousHash === commit[D-1].snapshotHash 對每一天都成立。
🔗 一番賞那邊也有公平性驗證
一番賞 (限量獎品池) 跟無限賞用不同的密碼學機制 —
一番賞用 Merkle commitment(適合限量獎品,pool 開始前就把所有
ticket→prize 對應 hash commit 公開),無限賞用 HMAC commit-reveal
(適合無限循環,每天 reveal seed 讓玩家事後重算)。兩種架構都
數學上不可篡改。
👉 前往一番賞公平性驗證頁
👉 前往一番賞公平性驗證頁
📜 透明度承諾
我們不能改的東西:
- 已經 commit 的當日機率 hash(SQLite trigger 物理擋)
- 已 reveal 的 raw_seed(trigger 擋 UPDATE)
- 已寫入的 audit chain row(trigger 擋 UPDATE/DELETE)
- 未來的機率 — 但今天 commit 已鎖死,新機率最快明天才會反映
- 新增的 prize / 新池 — 都會在 commit 中可見
- SHA-256: FIPS PUB 180-4 (NIST 標準,比特幣 / TLS / SSH 都用)
- HMAC-SHA256: RFC 2104 (Web Crypto API 內建)