終了したラウンドはすべて、公開されたオンチェーンデータだけを使って自分で検証できます。アカウントも特別な権限も必要ありません。確認するのは次の3点です。コミットメントハッシュがラウンド開始前に公開されていたこと、公開されたシークレットのハッシュがそのコミットメントと一致すること、そして公開された式で再計算した結果がラウンドの実際の配当結果と一致することです。
このガイドでは、終了した Crash のラウンドを1つ取り上げ、最初から最後まで検証します。運営者のシークレットがラウンドの前にコミットされていたこと、そしてクラッシュポイントが公開された式の結果とぴったり一致することを確かめます。特別な権限は必要ありません。すべてのデータは公開オンチェーンデータから取得できます。最後の短いセクションでは、それぞれ1つのトランザクションで検証できる Dice と Mines を扱います。
何を証明するのか
- コミットメントが先にあった。 シークレットのハッシュはラウンド開始前にオンチェーンに記録されていたため、ベットの後で結果を選ぶことはできませんでした。
- シークレットがコミットメントと一致する。
sha256(secret) がコミットされたハッシュと等しくなります。
- 倍率が正しい。 シークレットとブロックハッシュから式を再計算すると、ラウンドの配当に使われたクラッシュポイントとまったく同じ値になります。
ステップ1:アプリでラウンドの公平性データを開く
ベット履歴(またはラウンド履歴)を開き、終了したラウンドをクリックして詳細を表示します。ラウンドの結果と並んで、次の項目があります。
- クラッシュ倍率:検証対象となる最終倍率。
- ゲームシークレットハッシュ:公開された32バイトのシークレット。Solana エクスプローラー上のコミットトランザクションにリンクしています。
- ブロックハッシュ:チェーン由来のエントロピーとして使われる Solana のスロットハッシュ。ラウンド開始トランザクションにリンクしています。
- 「このゲームは公平?公平性検証ツールを使う」:このラウンドの情報が入力済みの状態で公平性検証ツールを開きます。ツールはラウンドの3つのトランザクション署名(コミット、ブロックハッシュ、公開)とネットワークを取得し、以下の計算をワンクリックですべて再現します。
公平性検証ツールは手軽な方法です。このページの残りの部分では、チェーンと自分のコンピューター以外は何も信頼しない、完全に独立した方法を説明します。
ステップ2:ラウンドの3つのトランザクション
ステップ3:Solana エクスプローラーで値を読み取る
お好みのエクスプローラー(Solscan、Solana Explorer、SolanaFM など)で、アプリが稼働しているネットワークを選んで各トランザクションを開きます。トランザクションのページで、デコードされたプログラムのイベントを探してください(「Logs」や「Instruction data」の下にある場合もあります。プログラムの IDL を認識するエクスプローラーでは、イベントのフィールドが名前付きでデコードされます)。
次の4つの値を集めます。
commit_hash:32バイト。コミットトランザクションから取得。
blockhash:32バイト。ブロックハッシュトランザクションから取得。
local_e:32バイトのシークレット。公開トランザクションから取得。
crash_point_bps:ベーシスポイント単位の最終クラッシュポイント。公開トランザクションから取得(29948 は 2.9948x を意味します)。
エンコーディングエクスプローラーによって、32バイトの値は16進数、base58、またはバイト配列で表示されます。下のスクリプトは16進数を前提としています。エクスプローラーが base58 で表示している場合は変換してください(どの base58 デコーダーでも構いません。重要なのは表記ではなくバイト値そのものです)。
ステップ4:順序を確認する
エクスプローラーで、コミットトランザクションとブロックハッシュトランザクションのスロット(またはブロック時刻)を比較します。コミットの方が先でなければなりません。これがこの仕組みの核心です。シークレットは、それと組み合わされるエントロピーが存在する前に封印されていたのです。
ステップ5:クラッシュポイントを再計算する
ステップ3で得た3つの16進数文字列を入力し、Node.js で次のコードを実行します(依存パッケージは不要です)。
両方の確認に合格する必要があります。commitment ok: true と表示され、出力されたクラッシュポイントがラウンドのクラッシュ倍率(および公開イベントの crash_point_bps)と一致しなければなりません。一致すれば、誰も信頼することなく、このラウンドの結果が開始前に確定しており、公開された式どおりに計算されたことを証明できたことになります。
Dice と Mines
インスタントゲームも同じ方法で、より少ないトランザクションから検証できます。
- Dice:ベットごとに1つのトランザクション。その
DiceBetSettled イベントには、導出に使うすべての入力(slothash、user、nonce)と roll および配当が含まれます。Dice の公平性の式で再計算してください。
- Mines:ゲームごとに2つのトランザクション。開始トランザクションがボードのコミットメントとスロットハッシュを公開し、精算トランザクションがシードとボード全体を公開します。Mines の公平性の式で再計算してください。
一致しない場合
まずはよくある原因を除外してください。16進数が必要な箇所に base58 の値を貼り付けた、別のトランザクションを見ている(各ラウンドには3つあります)、ラウンド当時とは異なるハウスエッジを使っている(エッジはオンチェーンの設定に保存されており、その変更自体もすべてオンチェーンのトランザクションです)、などです。
それでも本当に不一致がある場合、それこそがこの仕組みが明らかにするために存在するものです。データは公開され永続的に残るため、誰でもあなたの検証を再実行できます。ラウンド番号を添えてサポートにご連絡ください。なお、コミットメントや式の本当の不一致に正当な説明は存在しません。だからこそ、この仕組みはそれを隠せないようにしているのです。