¿QUÉ ES PROVABLY FAIR?

Rocketpot utiliza algoritmos ProvablyFair. Puede verificar el resultado del juego con el código fuente que se proporciona a continuación.

El sistema Provably Fair es un método matemático que se utiliza para garantizar que nadie, ni los jugadores ni el operador del sitio, pueda conocer el resultado del juego antes de que comience y que nadie pueda manipular los números aleatorios del juego.


¿CÓMO FUNCIONA?

Hemos generado una cadena de 8.000.000 hashesSHA256. Cada elemento es el hash de la representación de la cadena hexadecimal en minúsculas del hash anterior.

El hash del último elemento de la cadena es 5de24be2ba88f21070aca0b909a23ba8977a60e047e750dc6bd637aa3b4defc8

Cada juego se asigna a un hash en la cadena: El elemento 8.000.000 de la cadena es el hash del juego nº 1 y el primer elemento de la cadena es el hash del juego nº 8.000.000.


¿CÓMO SE VERIFICA?

Para verificar que un hash pertenece a un juego #n, basta con hacer un hash n veces y comparar el resultado con el hash final.

Para calcular el resultado de un juego a partir de su hash

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

function generateGameResultFromSeed(roundSeed, salt) {

  // Número de bits más significativos a utilizar
  const nBitsToUse = 52;

  // Paso 1. HMAC_SHA256(mensaje=semilla, clave=sal)
  const hmac = CryptoJS.HmacSHA256(roundSeed, salt);
  const roundHash = hmac.toString(CryptoJS.enc.Hex);

  // Paso 2. r = 52 bits más significativos
  const roundRandSource = roundHash.slice(0, nBitsToUse / 4);
  const r = parseInt(roundRandSource, 16);

  // Paso 3. Calcular el choque = r / 2^52, distribuido uniformemente en [0; 1)
  const twoPower52 = Math.pow(2, nBitsToUse);
  let crash = r / twoPower52;

  // Paso 4. Calcular el crash normalizado en el rango 100 - 100B
  crash = Math.floor(97 / crash);
  crash = Math.min(crash, 100000000000);
  crash = Math.max(crash, 100);

  // Paso 5. Tomar los siguientes 52 bits como semilla para la selección de jugadores en la ronda del Jackpot
  const jpPlayerRandSource = roundHash.slice(nBitsToUse / 4, 2 * nBitsToUse / 4);
  const jpPlayerRandom = parseInt(jpPlayerRandSource, 16);

  // Paso 6. Tomar los siguientes 52 bits como semilla para elegir el valor del Jackpot en la rueda
  const jpValueRandSource = roundHash.slice(2 * nBitsToUse / 4, 3 * nBitsToUse / 4);
  const jpValueRandom = parseInt(jpValueRandSource, 16);

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

Antes de ser utilizado para calcular el resultado correspondiente, cada hash del juego es salado con la representación en minúsculas y hexadecimal del hash de un bloque de bitcoin.

El número del bloque a utilizar fue publicado en el foro de Bitcointalk (URL https://bitcointalk.org/index.php?topic=5178349) antes de ser minado, lo que demuestra que no hemos elegido deliberadamente una cadena desfavorable para los jugadores.

Este bloque es #591433 con el hash 0000000000000014ccc7303b1be1fd8c6b2cb5e961d57fbdc57f661db418

Se puede comprobar que publicamos el número del bloque a utilizar antes de ser minado en las siguientes instantáneas del post del evento de siembra de bitcointalk: https://archive.is/Mwq4s , http://loyce.club/archive/posts/5224/52246534.html y https://archive.is/r8zCU (¡gracias LoyceV por raspar y archivar el post!)


SELECCIÓN DE JUGADORES DEL BOTE Y POSICIONES DE LA RUEDA

Los resultados de la rueda del bote se pueden verificar con el siguiente código:https://jsfiddle.net/7uackeqo/

Pasos de preparación:

  • 1. Dividir el hash de la ronda en 3 partes (52 bits cada una).
  • 2. Generar enteros a partir de cada parte.
  • 3. La 1ª parte es para el multiplicador (punto de choque).
  • 4. La 2ª parte es para seleccionar el jugador del bote.
  • 5. La 3ª parte es para determinar el resultado del giro de la rueda del jackpot.

Comentario: El proceso de generación de un entero a partir del hash es similar al de cualquier juego de choque, sólo que generamos 3 enteros en lugar de 1.

Pasos de la selección del jugador:

  • 1. Ordenar la lista de jugadores por nombres de usuario (ponerlos en minúsculas, no permitimos nombres duplicados que difieran sólo en mayúsculas).
  • 2. 2. Sumar las apuestas de todos los jugadores como valor total de la apuesta.
  • 3. Compruebe si hay un jugador cuya apuesta es mayor que el 90% del valor total de la apuesta.
    a. Si no hay tal jugador, continúe con el paso #4.
    b. En caso contrario - normalice las apuestas limitando la posibilidad de este jugador al 90%.
  • 4. Asigne a cada jugador el rango de valores en función de su importe de apuesta, nombre de usuario (después de la ordenación) y apuesta total (después de la normalización, si se ha producido).
  • 5. Utilizar el valor del paso de preparación #4 como semilla para la secuencia PRNG del twister mersenne.
  • 6. Tomar el siguiente valor insesgado de la secuencia Mersenne Twister PRNG que sea inferior a la apuesta total (valor del paso #2).
  • 7. 7. Elegir un jugador que esté en el rango del valor seleccionado.

Comentario: Una forma intuitiva de explicar el proceso de selección de jugadores es que cada jugador recibe 1 boleto por cada satoshi de la apuesta. Y luego se elige un boleto basado en el valor de la cadena de hash. Dada la lista de jugadores (que consiste en los nombres de los jugadores y sus apuestas) y el hash de la ronda, cualquiera puede verificar el resultado de la selección de jugadores. Una vez que todas las apuestas están comprometidas, no hay forma de que el operador manipule la selección de jugadores.

Pasos de la rueda:

  • 1. Usar el valor del paso de preparación #5 como semilla para la secuencia PRNG de mersenne twister.
  • 2. Tomar el siguiente valor insesgado de la secuencia Mersenne Twister PRNG que sea inferior al número de sectores de la rueda del bote.
  • 3. 3. Si el valor seleccionado es un sector de respin, tomar el siguiente valor insesgado de la secuencia Mersenne Twister PRNG y repetir hasta que se elija un sector no respin.

Comentario: Dada la configuración de la rueda (índices de los sectores y sus valores) y el hash de la ronda, cualquiera puede verificar el resultado de la rueda y no hay forma de manipular el resultado de la rueda después de que el evento de la semilla haya ocurrido.

Este texto ha sido editado el 24 de septiembre de 2019.