Bethropic

One nonce, many numbers: what the cursor counts

winter_ledger70閲覧 14
🌐 この投稿の原文はEnglishです· AI翻訳原文を見る

4番目の入力

provably fair ゲーミングに関するすべての説明(私たちのものを含む)は、3つの入力を挙げています:ハウスが事前にコミットするサーバーシード、自分で設定できるクライアントシード、およびすべてのベットで1つ上がるノンスです。これらをキー付きハッシュにフィードすると、ラウンドのランダム性が出力されます。その説明はコインフリップには完全です。ただし、ハッシュは1つの数字を生成し、ほぼすべてのゲームは複数の数字を必要とするため、他のほぼすべてに対しては不完全です。

4番目の入力はcursorです。このサイトでハッシュされるメッセージは「クライアントシード-ノンス」ではなく「クライアントシード-ノンス-カーソル」で、カーソルはラウンド内のカウンターです:ゲームが必要とする最初のランダム数は0、2番目は1というように続きます。各カーソル値は256ビットのダイジェストを生成し、隣接するものとは利用できる方法では関連がなく、エンジンは各ダイジェストの最初の8バイトを0から1の間の数字として読み込みます。

ENGINE-VERIFIED_shared/demoLocal.ts: uAt(pair, cursor) は u64(HMAC-SHA256(serverSeed, `${clientSeed}-${nonce}-${cursor}`)) を返し、サーバーの RandomUtils.generateHash("clientSeed-nonce-cursor") と一致すると説明されています。_shared/rng.ts: u64 はダイジェストの最初の8バイトを hi/2^32 + lo/2^64 として読み込み、サーバーの ULong→Double 変換と「同じ単一ラウンド構成」です。ノンスはすべてのゲーム全体でシードペアごとに1つのストリームです:各ベットは現在のノンスを消費し、nonce + 1 を保存します。

したがって、ラウンドは1つのランダム数ではなく、ゲームが必要とする限り番号が付けられたリストであり、リストのすべてのエントリはシードペアとノンスが決定した瞬間に固定されます。ゲームは進行しながら描画しません。すでに存在するリストを読み下ります。

各ゲームが読み込むもの

興味深い部分は、リストがゲームごとに異なり、各派生モジュールがそのヘッダーにそのレイアウトを記載していることです。シードペアから描画するすべてのオリジナルのカーソルストリームをエンジンソースから取り込みました。

各ゲームの派生モジュールからのラウンドごとのカーソル使用

GAMECURSORS READWHAT THEY BECOME
Limbo00.99 ÷ (1 − u) 曲線を通した1つの数字
Roulette0ポケット: floor(u × 37)
Fukubukuro0バッグのウェイトテーブルに対するアイテム
シックボー0、1、23つのサイコロ
チンチロ側面 × 9 + 試行 × 3 + サイコロ最大18まで:ディーラーのターン、その後プレイヤーのターン。各ターンで最大3回の3つのサイコロを投げる。役を作ったら側面が終わる
小判フリップフリップごとに1つフリップiはカーソルiを読む。最初のコインが購入されるとライドのすべての面が固定される
おみくじ0、その後1~3、その後4以上運勢のティア。勝利時の3つの当選セル。残りの詰め物グリフ
塔階ごとに1つ各階のトラップタイル:floor(u × タイル)
ビデオポーカー5、交換されたカード1枚につき1つ追加52枚のカードを使った無復元抽出シーケンス。すべて保持し、カーソルはそれ以上読まれない
カジノホールデム最大9プレイヤー1、プレイヤー2、ディーラー1、ディーラー2、フロップ1–3、ターン、リバー。ターンとリバーはコール時のみ読み込まれます
ブラックジャックカード1枚につき1つ無限シュー、カード = floor(u × 52)、配る順序:プレイヤー、ディーラーアップ、プレイヤー、ディーラーホール、その後さらにドロー
アンダルバハール0–4、その後はレースごとに1つ2つのブースト済みバケット、それらの大きさ、ジョーカー、そしてランクが繰り返されるまでのレース
ハナビスピンごとに15セル = リール × 3 + 行、フリースピンjは15 + 15j以降を読み込み
ビンゴ0–24、その後25–62カード、列ごとに5回のドロー。その後38個のボール

ケノとクラッシュは例外です。デモラウンドではシードペアノンスではなく、チケットごとのハッシュチェーンを使用しており、以下で説明します。マインズとプリンコはハウスサービスによって決済されます。マインズAPIでは、レイアウト全体が1つのノンスから生成されることが記載されています。

エンジン検証済みbingo/derive.ts内のヘッダーコメント(「カーソルストリーム:0..24 — カード…25..62 — 38個のボール」)、hanabi/engine.ts(「ベーススピン = セル0..14…フリースピンj = セル15+15j..29+15j」)、blackjack/derive.ts(「カードi = floor(u × 52)、カーソルi…配る順序(カーソル):プレイヤー1、ディーラーアップ、プレイヤー2、ディーラーホール」)、vpoker/derive.ts(「最初の5つが配り分、交換はその同じシーケンスを継続…すべてを保持し、それ以上のカーソルは読み込まれない」)、holdem/derive.ts(「プレイヤー1、プレイヤー2、ディーラー1、ディーラー2、フロップ1、フロップ2、フロップ3、ターン、リバー。ターン/リバーカーソルはコール時のみ消費される」)、andar/derive.ts(カーソル0–4その後「5..レースごとに1つカーソル」)、koban/derive.ts(「フリップiはカーソルiを読み込み」)、sicbo/derive.ts(「カーソル0/1/2は3つのサイコロ」)、roulette/derive.ts(「カーソル0のみがポケットを決定:floor(u × 37)」)、fuku/derive.ts(「カーソル0のみがアイテムを引く」)、omikuji/derive.ts(カーソル0段階、1..3勝利セル、4..フィラー)、demoLocal.ts rollSide(ちんちろカーソル = side*9 + attempt*3 + d)、trapAt(塔:階数はカーソル)、demoLimboBet(uAt(p, 0))。mines/minesApi.ts(「マイン全体のレイアウトはこの1つのノンスから生成される」)。

そのテーブルで3つのことが目立ちます。第1に、カードを配るゲームは固定順序でカード1枚につき1つのカーソルを読み込みます。これがブラックジャックのハンドをアクションリストからリプレイできる理由です。ヒットする決定はカードを作成せず、配る前に完成していたリスト上の次のカードを表にします。第2に、いくつかのゲームは早期に読み込みを停止します。5枚すべてを保持するビデオポーカーのハンドはカーソル5に触れない。ホールデムのフォールドはターンやリバーを読まない。その数字はありましたが、ゲームは必要ありませんでした。第3に、アンダルバハールのオミクジの2つのブースト済みバケットと運勢段階は、ストリームの先頭にあるカードとセルの前に引かれるため、ラウンドの特別な機能は通常のものと同じコミットメントで固定されます。

置換なし描画

0から1の間の均一な数値はルーレットのポケットに変換しやすい:37を掛けて切り捨てます。デッキはより困難です。2番目のカードは1番目のカードと同じであってはならないためです。エンジンはコメントでプールホップと呼ばれるもので処理します。プール内のカードのリストを保持し、カーソルの数値を使用してその位置を選択し、選択されたカードをリストの終わりにスワップして、次の描画は1つ少ないカードから選択します。ビデオポーカー、カジノホールデム、アンダルバハール、ビンゴカードはこの方法で描画するため、ラウンド内にカードや数値が繰り返されません。

ブラックジャックは意図的な例外です。そのシューは無限です。すべてのカードは独自のカーソルからfloor(u × 52)であり、同じカードがハンド内に2回現れる可能性があります。これは公開されたコストブラックジャック配当の記事を持つ設計上の選択であり、マーケティングページでは語られないカーソルレイアウトが示す正確なタイプのものです。

エンジン検証済みvpoker/derive.ts:「カードは52枚デック全体の置換なしシーケンス(プールホップ、描画ごとのカーソル)から取得」。holdem/derive.ts:「置換なしプールホップシーケンス(描画ごとのカーソル)」。bingo/derive.ts:「列ごとに5つのプールホップ描画」および「38個のボール、1..75上のプールホップ」。blackjack/derive.ts:「無限シュー:カードi = floor(u × 52)、カーソルi」。

2つの例外

KenovとCrashはデモエンジンでseed-pair nonceを全く読まない。Kenoはper-ticketスキーム:チケットは独自のrandom hashとsaltを取得し、10個のボールのそれぞれは前のhashを再度ハッシュして生成される。leading bitsを数字として取り、40個のshrinking poolから選ぶ。fairness panelはseed pairではなく、これら2つの文字列からkenoチケットを検証する。Crashはbustabit慣例に従う。hashの連鎖で、各ラウンドのcrash pointは正確な整数演算で独自のリンクから計算される。

ENGINE-VERIFIEDdemoLocal.ts kenoDraws: “per-bet randomHash chain + salt (verifiable per ticket via the fairness modal) … Does not touch the seed-pair nonce”; the loop hashes HMAC-SHA256(salt, previous hash) ten times, reads the leading 52 bits and picks index floor(norm × remaining) from a 40-number pool with a swap to the end. rng.ts h52 and the crash comment: “bustabit crash point in hundredths: floor((n·e − h)/(e − h)), e = 2^52, n = 100 … Exact BigInt math to match the server”.

どちらの例外もcursorスキームより弱くない;どちらもより古く、よく知られている。プレイヤーにとって重要なのは、panelがラウンドに使われたスキームを表示すること、そして各スキームが表示される文字列から再計算できることだけである。

テーブルでの意味

  • ラウンドはあなたが行動する前に存在する。ラウンドのあらゆるカード、ボール、リールシンボルはseed pair、nonce、およびそのcursor positionの関数である。ヒット、コール、ホールドはどのエントリが読まれるかを選択するもので、その内容を選択するのではない。
  • あなたの選択はリストを変えられず、ハウスも変えられない。サーバーseedがコミットされ、nonceが固定されたら、どちらの側でも、seedを変えずにエントリ7を変更することはできない。これはあなたに表示されたfingerprintを破壊する。
  • 検証者は同じリストを同じ方法で読む必要がある。bingoラウンドの再計算は公開された順序で63個のカーソルをすべて導出することを意味し、Hold'em foldの再計算は7個を導出することを意味する。seedパネルはブラウザでこれを実行し、上表のlayoutsがそれが従うものである。
  • ストリークはムードではなくリストである。2つのラウンドはseed pair以外何も共有しない;nonceが異なり、すべてのdigestが異なる。これはhot hand articleが別の角度から述べていることと同じポイントである。
3つの入力がラウンドを決定する。4番目の入力はラウンドがどのくらい長いか決定する。cursor、1行で

上記のcursor layoutsはブラウザ検証器とデモエンジンが共有するクライアント側導出モジュールから読み込まれる。ハウスサービスは支払い当局である;ソースのコメントがモジュールがサーバーをミラーしていると言う場合、それは書かれたとおりに引用され、我々により認証されない。

FAQ

provably fairラウンドのcursorとは何か?

ラウンド内のカウンター。サーバーseedでハッシュされたメッセージは"client seed-nonce-cursor"である;cursor 0はゲームが必要な最初のrandom numberを与え、cursor 1は2番目を与え、以下同様。1つの数字が必要なゲームはcursor 0のみを読む。

cursorはnonceとどう違うか?

nonceはラウンドをカウントし、すべてのoriginalを通じて各ベットで1ずつ増加する。cursorは1つのラウンド内の抽出をカウントし、各ラウンドで0に戻る。seed pairと共に、サイトが生成するすべてのrandom numberを識別する。

bingoラウンドは何個のrandom numberを使うか?

63個:cursor 0~24は25個セルのカードをレイアウトし、cursor 25~62はプール内でreplacement無しで38個のボールを抽出する。

blackjackでヒットすると次のカードが変わるか?

いいえ。各カードはディール順序で独自のcursorから導出され、seed pairとnonceが固定されると全リストが存在する。ヒットは次のエントリを読む;スタンドはそれを未読のままにする。

すべてのゲームがカーソルスキームを使用していますか?

KenoとCrashは代わりにハッシュチェーンを使用しています。kenoはチケットごとのランダムハッシュとソルトを10回ハッシュし、crashはbustabitチェーンに正確な整数演算で従います。フェアネスパネルは表示される文字列からそれぞれを検証します。

ソースと参考資料

  • Betkyo engine source: _shared/demoLocal.ts (uAt, rollSide, trapAt, kenoDraws), _shared/rng.ts (u64, h52, crash point)、およびbingo、hanabi、blackjack、vpoker、holdem、andar、koban、sicbo、roulette、fuku、omikujiの派生モジュール
  • RFC 2104 — HMAC: Keyed-Hashing for Message Authentication
  • Bustabit provably fair scheme (crash-point constructionはエンジンがミラーリングしています)

この記事のゲーム

ブラックジャック — ルール & 無料プレイ →ビンゴ — ルール & 無料プレイ →シックボー — ルール & 無料プレイ →

One nonce, many numbers: what the cursor counts

コメント (1)

  • winter_anchor36

    So the cursor is basically just tracking which random number you're on within a single round? That makes sense for games that need multiple values per bet.