WHAT IS PROVABLY FAIR?

RocketpotはProvably Fairアルゴリズムを使用しています。以下に提供されているソースコードでゲームの結果を検証することができます。

プロバブリーフェアシステムとは、ゲームが始まる前にプレイヤーもサイトの運営者も誰もゲームの結果を知ることができず、誰もゲームの乱数を改ざんすることができないようにするための数学的な方法です。


どのように機能するのか?

8,000,000,000のSHA256ハッシュのチェーンを生成しました。各要素は、前のハッシュの小文字、16進数の文字列表現のハッシュです。

鎖の最後の要素のハッシュ値は5de24be2ba88f21070aca0b909a23ba8977a60e047e750dc6bd637aa3b4defc8です。

すべてのゲームはチェーンのハッシュにマッピングされます。鎖の8,000,000番目の要素はゲーム#1のハッシュであり、鎖の最初の要素はゲーム#8,000,000のハッシュです。


検証方法は?

ハッシュがゲーム#nに属していることを確認するには、単純にそれをn回ハッシュして、その結果を終了ハッシュと比較します。

ハッシュからゲームの結果を計算すること。

const CryptoJS = require("crypto-js")。

関数 generateGameResultFromSeed(roundSeed, salt) {.

  // 使用する最上位ビット数
  const nBitsToUse = 52.

  // ステップ1.HMAC_SHA256(message=seed, key=salt)
  const hmac = CryptoJS.HmacSHA256(roundSeed, salt).
  const roundHash = hmac.toString(CryptoJS.enc.Hex)。

  // ステップ2. r = 52最上位ビット
  const roundRandSource = roundHash.slice(0, nBitsToUse / 4).
  const r = parseInt(roundRandSource, 16).

  // ステップ3.クラッシュ=r / 2^52を計算します。
  const twoPower52 = Math.pow(2, nBitsToUse).
  let crash = r / twoPower52.

  // ステップ4.100~100Bの範囲で正規化されたクラッシュを計算する
  クラッシュ = Math.floor(97 / クラッシュ)。
  クラッシュ = Math.min(crash, 100000000000).
  クラッシュ = Math.max(crash, 100).

  // ステップ5.次の52ビットをジャックポットラウンドのプレイヤー選択のためのシードとして取る
  const jpPlayerRandSource = roundHash.slice(nBitsToUse / 4, 2 * nBitsToUse / 4).
  const jpPlayerRandom = parseInt(jpPlayerRandSource, 16).

  // ステップ6.次の52ビットを種にして、ホイール上のジャックポットの値をピックします。
  const jpValueRandSource = roundHash.slice(2 * nBitsToUse / 4, 3 * nBitsToUse / 4).
  const jpValueRandom = parseInt(jpValueRandSource, 16).

  return {roundHash, jpPlayerRandom, jpValueRandom, crash, roundSeed}; }; }。


対応する結果を計算するために使用される前に、各ゲームのハッシュは、ビットコインブロックのハッシュの小文字、16進数の文字列表現で塩漬けにされます。

使用するブロックの番号は、採掘される前にBitcointalkフォーラム(URL https://bitcointalk.org/index.php?topic=5178349)で公開されており、意図的にプレイヤーにとって不利なチェーンを選んでいないことが証明されています。

このブロックは、ハッシュ000000000000000014ccc7303b1be1fd8c6b2cb5e961d57fbdc57f661db418#591433です。

それは、私たちが採掘される前に使用するブロックの番号を以下のbitcointalk seedingイベント投稿のスナップショットで投稿したことを確認することができます: https://archive.is/Mwq4s , http://loyce.club/archive/posts/5224/52246534.html と https://archive.is/r8zCU (投稿をスクレイピングしてアーカイブしてくれたLoyceVに感謝します!)。


JACKPOT PLAYER SELECTION AND WHEEL POSITIONS

ジャックポットホイールの結果は、次のコードで検証することができます: https://jsfiddle.net/7uackeqo/

準備の手順。

  • 1.ラウンドハッシュを3つの部分(各52ビット)で割る。
  • 2.各部分から整数を生成します。
  • 3.3. 第1部は乗数(クラッシュポイント)の設定です。
  • 4.第2部は、大当たり遊技者を選択するためのものである。
  • 5.前記第3部は、前記大当たりホイールのスピン結果を決定するためのものである。

コメント:ハッシュから整数を生成するプロセスは、クラッシュゲームと似ていますが、1の代わりに3つの整数を生成するだけです。

プレイヤーの選択ステップ。

  • 1.1. プレイヤーリストをユーザ名で順番に並べる(小文字にキャストしてください。
  • 2.2. 全てのプレイヤーのベットを合計ベット額として集計します。
  • 3.3. ベット額がベット総額の90%よりも大きいプレイヤーがいるかどうかをチェックします。 a
    . そのようなプレイヤーがいない場合は、ステップ#4に進みます。
  • 4.4. 各プレイヤーのベット額、ユーザー名(順序付け後)、総ベット額(正規化後)に基づいて、各プレイヤーを値の範囲に割り当てます。
  • 5.5.準備ステップ#4の値をmersenne twister PRNGシーケンスのシードとして使用します。
  • 6.Mersenne Twister PRNGシーケンスから、ベット総額(ステップ#2の値)よりも低い次の偏りのない値を取ります。
  • 7.7.選択された値の範囲内にある遊技者を選択します。

コメント:プレイヤーの選択プロセスを説明するための直感的な方法は、各プレイヤーがベットの各サトシごとに1枚のチケットを取得するということです。そして、ハッシュチェーンの値に基づいて1枚のチケットが選ばれます。プレイヤーリスト(プレイヤー名とそのベットからなる)とラウンドハッシュがあれば、誰でもプレイヤーの選択結果を確認することができます。すべてのベットがコミットされると、オペレータがプレイヤーの選択を操作することはできません。

ホイールスピンのステップ。

  • 1.準備ステップ#5の値をメルセンヌツイスターPRNG配列の種として使用します。
  • 2.2. Mersenne Twister PRNGシーケンスから、ジャックポットホイールのセクター数よりも低い次の偏りのない値を取ります。
  • 3.3. 選択された値がレスピンセクタの場合、Mersenne Twister PRNG シーケンスから次の偏りのない値を取り、レスピンセクタ以外のセクタが選択されるまで繰り返す。

コメント:ホイールの設定(セクタインデックスとその値)とラウンドハッシュがあれば、誰でもホイールのスピン結果を確認することができ、シードイベントが発生した後にスピン結果を操作する方法はありません。

このテキストは2019年9月24日に編集されました。