何が、いつコミットされるのか
Minesのゲームは1件のオンチェーントランザクション(mines_start)で始まり、このトランザクションがタイルを選ぶ前に次の3つを同時に行います。
- オペレーター側の要素をコミットします。 バックエンドがランダムな32バイトの
server_seedを生成し、トランザクションはそのSHA-256ハッシュ、つまりコミットメントを保存します。シードそのものはゲーム終了まで非公開のままです。 - チェーンのエントロピーを取得します。 プログラムはSolanaの
SlotHashessysvarから最新のスロットハッシュを読み取り、ゲームに保存します。 - 条件を固定します。 ハウスエッジ、配当上限、返金タイムアウトがゲームにスナップショットとして記録されます。プレイ中の盤面の条件が後から変更されることはありません。
Minesの盤面はどのように導出されるのか
25枚のタイルには、5×5のグリッド上で行ごとに0から24までの番号が振られます(index = row × 5 + column)。盤面は25ビットのマスクで、ビットtが立っていればタイルtに地雷があることを意味します。
- ハッシュ入力の順序は厳密に、シード、スロットハッシュ、ユーザーアカウントのアドレス、nonce(8バイト、リトルエンディアン)、ASCIIタグ
"mines"、ブロックカウンター(8バイト、リトルエンディアン、0から開始)です。 - 4バイトのチャンクはそれぞれビッグエンディアンで読み取ります。1つのブロックから得られる抽選は最大8回で、必要に応じて次のカウンター値でストリームを補充します。
- 棄却サンプリングのループにより、すべての抽選は厳密に一様になります。シャッフルに偏りが入り込む余地はありません。
プログラムが強制する配当式は
安全なタイルをめくるたびに、キャッシュアウト額に生存確率のちょうど逆数が掛けられ、ハウスエッジは1回だけ適用されます。
期待リターンは、地雷の数とめくる枚数のどの組み合わせでも
1 − edgeです。現在の値は手数料と上限に掲載しています。
決済時にプログラムが強制すること
決済トランザクション(mines_settle)はserver_seedを公開し、結果を申告します。めくったタイルの組を伴うキャッシュアウト、または特定のタイルでのバーストのいずれかです。そのうえでプログラムはすべてをオンチェーンで検証します。
sha256(server_seed)はゲーム開始時に保存されたコミットメントと一致しなければなりません。別のシードではゲームを決済できません。- 盤面は上記の式でゼロから再導出されます。めくったと申告されたタイルが実際には地雷であれば拒否され、バーストと申告されたタイルが地雷でなければ拒否され、バーストのタイルがめくったタイルとしても申告されていれば拒否されます。
- 倍率は、スナップショットされたエッジと実際にめくった枚数からオンチェーンで計算されるため、配当を偽って報告することはできません。
- 決済イベントは、シード、スロットハッシュ、地雷マスク全体、めくったタイル、結果を恒久的に公開します。
保証されること、されないこと
プログラムが強制すること:- 盤面は、コミットメントと保存されたスロットハッシュにより、最初のタイルを選ぶ前に確定します。ゲームの途中で地雷が動くことはありません。
- 決済時、オペレーターは盤面について嘘をつけません。誤ったシード、地雷を安全と申告すること、偽のバーストは、いずれもトランザクションを失敗させます。
- 開始時の条件(エッジ、配当上限、タイムアウト)はゲーム終了まで適用されます。
- 賭け金がロックされたままになることはありません。オペレーターが決済しない場合、ゲームのタイムアウト後は誰でもキャンセルを実行でき、賭け金が返金されます。通常の運用ではそこまで至りません。放置された盤面はタイムアウト前に現在の倍率でキャッシュアウトされるため(Minesを参照)、賭け金だけでなく獲得額も受け取れます。誰でも実行できるキャンセルは、オペレーターがいなくなった場合に備えた土台となる保証です。
- プレイ中、オペレーターは盤面を知っています。 これは構造上のもので、この設計特有の欠陥ではありません。タイルの結果はオフチェーンで即座に返されるため、それを返す側は地雷の位置を知っている必要があります。どんな乱数方式でもこれは解消できません。たとえVRFで生成した盤面でも、最初のタイルの結果を返した時点でオペレーターはそれを知ることになります。コミットメントが保証するのは、この知識を使って盤面を変更したり、結果を偽って報告したりできないということです。
- 開始のタイミング。 盤面はゲーム開始時に取得したスロットハッシュに依存し、開始トランザクションはバックエンドが送信します。これは他のゲームと同じタイミング上の考慮事項です。盤面を事前に知っていても、選ぶタイルが予測可能な場合にしか役に立ちません。クリックする位置を変えれば、タイミングを利用した盤面の選別は無効になります。
- 無効化。 オペレーターは進行中のゲームをキャンセルできます(原則として、勝っている最中のゲームも含みます)。キャンセルでは賭け金が全額返金され(没収する経路は存在しません)、必ず公開イベントが発行されるため、無効化の頻度は誰でもオンチェーンで監査できます。
- ゲームごとに新しいシードを使う必要があります。公開済みのシードは誰でも見られるため、再利用すると次の盤面を誰でも導出できてしまいます。プログラムは連続した再利用をオンチェーンで拒否し、バックエンドはグローバルな一意性を保証しています。
Minesのゲームを検証するには
ゲームの最後のトランザクションに含まれる決済イベント(MinesGameSettled)には、server_seed、slothash、user、nonce、mines_count、mines_mask、revealed_mask、bust_tile、multiplier_bps、is_winが含まれます。検証手順は次のとおりです。
- コミットメントを確認します。
sha256(server_seed)は、ゲームの開始トランザクション(MinesGameStartedイベント)で公開されたcommit_hashと一致しなければなりません。これにより、最初のタイルを選ぶ前に盤面が固定されていたことが証明されます。 - 上記の式で地雷マスクを再導出し、イベントの
mines_maskと比較します。 - マスクと結果を照合します。
revealed_maskのすべてのビットが安全なタイルであり、バーストのタイルが地雷でなければなりません。 - 配当式で倍率を確認します。