Menu

Explicando el Provably Fair – Casinos Provably Fair

La transparencia ha sido uno de los grandes caballos de batalla de la industria de juego en línea. Cuando los casinos tradicionales dieron el salto al mundo digital, uno de los mayores desafios que tuvieron que afrontar fue el poder generar resultados basados en eventos aleatorios. A diferencia del mundo real, donde uno puede barajear cartas o lanzar dados para hacer que algo sea aleatorio, era muy dificil hacer eso mismo con las funciones aleatorias disponibles en aquel momento que distintos idiomas de programación ofrecian. La primera solución que los casinos de la epoca encontraron fue la de desarrollar e implementar el algoritmo generador de números aleatorios (RNG).

El generador de números aleatorios (RNG) y sus problemas

En un sistema RNG (random number generator), los resultados se obtienen de una semilla (un número aleatorio muy grande) que el público desconoce. Esta semilla se combina con un algoritmo que produce una serie de hashes que son completamente impredecibles, no repetitivos y distribuidos de manera uniforme. Estos hashes se utilizan para determinar el resultado de cada apuesta. Para que esto sea más atractivo para los jugadores, los casinos tienen que certificar sus algoritmos RNG mediante auditores externos (se presume que son neutrales), y una vez aprobados, mostrar un sello de “certificado” en su web.

Gracias a este sistema RNG, las apuestas en línea se volvieron muy populares y fiables para el público. Sin embargo, sigue habiendo algun que otro problema. El poder de generar los resultados sigue estando en manos de los casinos. Los jugadores no pueden hacer nada para influir en el resultado. Tienen que confiar ciegamente en el casino, y creerse que el casino está utilizando el sistema RNG de manera honesta (cosa que puede que no esté ocurriendo).

Los mejores casinos Provably Fair

Sistemas Provably Fair y sus ventajas

Con la revolución que supuso la tecnología Blockchain al principio de la década pasada, ¡las apuestas online se han visto completamente transformadas! La tecnología Blockchain ha abierto las puertas a un nuevo mundo de innovación que hasta el momento nunca habían sido conocidas para los programadores. Gracias a esto, en bastante poco tiempo muchos casinos habían desarrollado un nuevo sistema que ofrecia transparencia, conocido comunmente como Sistema Provably Fair. Con el algoritmo Provably Fair, los jugadores podían participar en el proceso de generación de los resultados, y no tenían que confiar ciegamente en los casinos. Es más, los jugadores tenian ahora la posibilidad de verificar sus resultados nada más hacer una apuesta.

A diferencia de los sistemas RNG, donde la semilla que generaba los resultados la ponía el casino, en un sistema Provably Fair, la semilla se combina con otra semilla adicional que el jugador proporciona; comunmente conocida como semilla del cliente” o “sal”. De esta forma, combinando la semilla del casino y la del jugador, se obtiene la semilla desde la que se obtendrá el resultado de la apuesta. Para entender esto mejor, veamos un ejemplo:

Número de semilla – 845165 (en la práctica, este numero es muy grande)

Semilla del cliente– 524650

Algoritmo utilizado– SHA256

En un sistema RNG: Se utiliza el algoritmo SHA256 para generar el hash de 845165 (semilla) que será b165e5e8fcbcf8d597cb5a29c0b311752554842fc838ee3e6c7dcccd9db343ca

En un sistema Provably Fair: Antes de generar el hash, se combinan las semillas de casino y jugador, p.ej.: ‘845165524650’ y se aplica el SHA256 de este número, que será b3113390d493525c4062847190d056c0822dd2ccae67b373ec9d3df4aeb88161

¿Podeis ver como el resultado del hash obtenido en el sistema Provably Fair es radicalmente distinto al del sistema RNG? En un sistema Provably Fair, los casinos pierden la egemonía de generar los resultados y el resultado final se obtiene gracias al aporte del jugador. Es por esto que los casinos ya no son capaces de manipular los resultados. Gracias a esto, se dice que el algoritmo Provably Fair es el mayor avance que se ha logrado en la industria de las apuestas en línea. En la proxima sección estudiaremos el proceso por el que se genera un resultado utilizando el algoritmo Provably Fair en detalle, a nivel tecnico y las prácticas habituales del sector.

Provably Fair Casinos

Parametros utilizados en un sistema Provably Fair

Antes de seguir adelante, vamos a fijarnos en los terminos más habituales que se utilizan en algoritmo Provably Fair:

  • Semilla del servidor – La semilla simplemente significa que algo es aleatorio. Si tuvieras que elegir un número entre el 1 y el 10 y eliges el 8 sin pensar en nada más, acabas de crear una semilla aleatoria. En el mundo del Provably Fair se utiliza la palabra “semilla” para referirse a un grupo de caractéres aleatorio. Mientras que el “servidor” hace referencia al casino. Asique, basicamente hablar de la “semilla del servidor” viene a significar que se trata del número aleatorio del casino.
  • Semilla del cliente o semilla pública –Lo mismo que la semilla del servidor, solo que haciendo referencia a que se trata del número que el jugador aporta.
  • Nonce – Este es un número ascendente. Puede empezar por el 0 o 1, dependiendo del sistema que el casino haya decidido usar. Este parametro se utiliza porque los jugadores no suelen cambiar su semilla despues de cada apuesta. Sabemos que un resultado se obtiene combinando las semillas del casino y el jugador, y si ambas se mantienen para la siguiente apuesta, el resultado será el mismo que la apuesta anterior, ¿verdad? De esta forma, un jugador podría estafar a un casino con una facilidad asombrosa tras haber realizado una sola apuesta. Para evitar que esto ocurra, se añade un número a la mezcla tras la semilla del cliente que simplemente representa el número de apuesta que es. Para la primera apuesta, por tanto, el número será 0 (o 1), para la segunda será 1. para la siguiente 2, y así hasta que se cambien las semillas (depende del casino tambien).
  • Algoritmo de Hash – El algoritmo de hash se utiliza para combinar la semilla del servidor, la del cliente, y el nonce y con todo esto producir un hash que luego se utiliza para determinar el resultado de la apuesta. Haciendo un simil, si metes varias piezas de fruta en una batidora y lo mezclas todo bien; vas a conseguir un buen batido; que será en este caso nuestro hash. Es interesante, ¿verdad?

Funcionamiento del algoritmo Provably Fair

¡Okay! Ahora que ya tenemos unas nociones basicas de las distintas variables que se utilizan en un algoritmo Provably Fair, es hora de expandir nuestros conocimientos sobre este sistema un poco más. Para ello, usaremos un ejemplo real:

El proceso empieza cuando un casino elige una semilla de servidor. En nuestro caso, esa semilla será: 4d74402b863d0c8690a7bfdc58f1a2780cbaabde42f5eedda8fef9c2489c7eab. Como ya hemos mencionado antes, se trata de un conjunto aleatorio de caractéres y puede tener cualquier forma. Sin embargo, los casinos tienen que utilizar un algoritmo bastante potente para generar las semillas del servidor y que estas sean lo suficientemente aleatorias como para que los jugadores no puedan descifrarlas antes de empezar a jugar.

El siguiente paso implica comunicarle la semilla del servidor al jugador. Sin embargo, si el casino ofreciese esta semilla tal cual, el jugador podría calcular el resultado de antemano y apostar en base a un resultado que ya conoce. Para evitar esto, el casino encripta esa semilla del servidor, y le envia al jugador el “hash de la semilla”. El algoritmo de cifrado más habitual para esto es el SHA-256. Es un algoritmo que solo funciona en un sentido y es practicamente imposible descifrar el origen del hash. En nuestro caso, el hash SHA-256 de nuestra semilla es el siguiente: 0bfb295705ae78632a3c7479adfc86178fa7c306791cdc5a1a64b92bf9b889b2.

Una vez el jugador conoce el hash de la semilla del servidor, puede elegir su semilla de cliente. En este ejemplo, digamos que la semilla del jugador va a ser esta: dwownvonqorodoacnvosvrt. Ahora el jugador realiza varias apuestas. Suponiendo que el jugador haya realizado 2 apuestas, puede pedirle al casino que revele la semilla del servidor. Tras recibir esta solicitud, el casino cambiará su semilla del servidor y comunicará la anterior al jugador tal y como este ha pedido.

Ahora el jugador cuenta con toda la información que necesita para verificar que sus resultados no han sido manipulados. Vamos a ver como:

Semilla del servidor: 4d74402b863d0c8690a7bfdc58f1a2780cbaabde42f5eedda8fef9c2489c7eab

Semilla del servidor (hash): 0bfb295705ae78632a3c7479adfc86178fa7c306791cdc5a1a64b92bf9b889b2

Client Seed: dwownvonqorodoacnvosvrt

Nonce: 0 para la primera apuesta y 1 para la segunda.

Tras conocer la semilla del servidor, el primer paso para el jugador es comprobar que ha recibido la semilla correcta. Para esto, el jugador tiene que comprobar que mediante el uso del SHA-256 el hash que obtiene de la semilla que se le ha proporcionado coincide con el hash de la semilla que se le mostraba antes de apostar; comprobando que el casino no la ha cambiado después de haber empezado a apostar. Dicho de otra forma,

SHA-256(semilla del servidor obtenida) = Semilla del servidor (Hash)

Puedes utilizar esta herramienta para calcular el SHA-256 de cualquier cosa de manera sencilla:  https://emn178.github.io/online-tools/sha256.html

El siguiente paso será determina que algoritmo de hash utiliza el casino para obtener los resultados. El algoritmo más popular entre los casinos actualmente es el HMAC-SHA-512, sin embargo, puede tratarse de cualquier algoritmo de hash seguro. Asumiendo una vez más que en nuestro ejemplo se utiliza el HMAC-SHA-512. El algoritmo HMAC-SHA-512 necesita dos variables “clave” y un “mensaje” como información de entrada y produce un mensaje de salida de 512 bits.

En nuestro caso,

Clave = semilla del servidor

Mensaje = semilla del cliente + nonce

Por lo tanto, para la primera apuesta tenemos:

Clave = 4d74402b863d0c8690a7bfdc58f1a2780cbaabde42f5eedda8fef9c2489c7eab

Mensaje = dwownvonqorodoacnvosvrt0

Existen varias herramientas en internet para calcular un hash HMAC-SHA512, esta es una que podrías utilizar:  https://www.freeformatter.com/hmac-generator.html

El hash resultante será: 1e8734d7837322dec5e5d269205fdb469cf4697288cc14bc5971129ee6563636c5a820eeb92326a2a7606cb027a8df884de1fc313b512fc54ae8d491489299f9

Más información sobre como se utiliza este hash para calcular el resutlado de diversos juegos en nuestra siguiente sección.

¿Cómo funciona el algoritmo Provably Fair en juegos de un solo jugador como el dado?

En los juego de un solo jugador, los casinos generan distintas semillas de servidor para cada jugador y le informan al mismo del hash de esa semilla. El jugador tiene en su mano elegir la semilla del cliente que quiera. El proceso es similar a lo visto en la anterior sección. Ahora, veamos como se utiliza el hash obtenido en el anterior ejemplo para calcular el resultado de un juego de dados.

HMAC-SHA512 hash = 1e8734d7837322dec5e5d269205fdb469cf4697288cc14bc5971129ee6563636c5a820eeb92326a2a7606cb027a8df884de1fc313b512fc54ae8d491489299f9

El dado es uno de los juegos más populares en los casinos de internet. En el dado, el jugador elige un rango de números, por ejemplo del 0 al 50, y se lanza un dado con resultados del 0 al 100. Si el número que sale está dentro del rango del jugador, el jugador gana. Si no, pierde.

Como el hash generado por el algoritmo HMAC-SHA-512 es un número hexadecimal, puede convertirse a un número decimal con relativa faciliadad. Decimal significa 10; por lo que los números decimales son los números normales del 0 al 9 que utilizamos a diario. Por otro lado, hexadecimal siginifica 16, por lo que los números hexadecimales empiezan también entre el 0 y el 9 y después se añaden 6 caractéres adicionales, p. ej. de la “a” a la “f”. Por lo tanto, un 15 en sistema decimal equivaldría a una “f” en sistema hexadecimal.

Para el juego de dado, evaluamos el hash de 5 caractéres en 5. El valor de 5 carácteres puede ir desde “00000” a “fffff”. Por acuerdo, 0x suele utilizarse frente a números hexadecimales, por lo que podemos decir que 5 caractéres de un número hexadecimal puede tener valores en el rango de 0x00000 – 0xFFFFF. El equivalente decimal de 0x00000 es 0 mientras que el de 0xFFFFF es 1048575.

Centrandonos ahora en nuestro ejemplo, los primeros 5 caractéres del hash son 1e873 o 0x1E873. Sabemos que se trata de un número hexadecimal, por lo que lo convertimos a decimal. El número decimal que corresponde al hexadecimal 0x1E873 es 125,043. Como ya hemos mencionado anteriormente, el valor puede estar entre 0 y 1,048,575. Por lo que es posible que el valor de los primeros 5 caractéres hexadecimales sea superior a 1,000,000. Si esto ocurriera, se ignorarían esos 5 caractéres y se tomarían los siguientes 5. El proceso continúa hasta que obtengamos un número inferior a 1,000,000. Como en nuestro ejemplo el número es 125,043, que ya es menor que 1,000,000, es un número y no tenemos que repetir el proceso con los siguientes 5 caractéres.

Ahora solo tenemos que conseguir el modulo de 125043 con respecto a 10000. El modulo no es más que el número resultante de la división entre dos números. Cuando dividimos 125043 entre 10000, obtenemos un resultante de 5043. Por lo tanto, el modulo de 125043 con respecto a 1000 es 5043.

El último paso será dividir ese resultante entre 100. En nuestro ejemplo, 5043/100 es 50.43.

El resultado final de nuestra tirada será 50.43. Si el jugador ha elegido un rango de 0 a 50, perderá la apuesta ya que el resultado está por encima del rango.

¿Cómo funciona el algoritmo Provably Fair en juegos multijugador como el crash?

En los juegos multijugador, los casinos aportarán la misma semilla de servidor para todos los jugadores de esa ronda. La duda viene ahora: ¿Cómo se decide cual va a ser la semilla del cliente si hay más de un jugador? Para solucionar este problema, el casino elige un suceso sobre el que ni el casino ni los jugadores tienen control alguno. Esto podria ser el hash de un bloque de bitcoin o ethereum. La siguiente duda que se plantea, es que si todos conocen el hash del bloque que se va a usar como semilla de cliente de esa ronda, ¿no puede el casino elegir una semilla de servidor que sepa que combinada con dicho hash produzca unos resultados favorables para el casino?

Para atajar esta tesitura, el casino publica todas las semillas que se van a utilizar en el futuro antes de que se mine el bloque. Imagina que el casino pretende usar el hash del bloque #647000 como semilla de cliente y este no ha sido minado aún. El casino genera entonces, por decir algo, 10 millones de semillas de servidor y publica el hash de todas esas semillas de manera pública antes de que el bloque #647000 se mine. De esta forma, el casino no tiene ningún control sobre los resultados de las futuras partidas ya que no pueden saber cual va a ser la semilla del cliente que se va a utilizar.

Sin embargo, esto nos genera una nueva duda: ¿no es contraproducente publicar 10 millones de hashes en público? ¿Cómo podrán los jugadores verificar los datos en una muestra tan inmensa y asegurarse de que cada semilla se ha utilizado en orden? Para solventar esto, se utiliza un concepto denominado “cadena de hash”. Como hemos leido anteriormente, es practicamente imposible encontrar el origen de un hash generado con SHA-256. Sabiendo esto, el casino elegirá una semilla como la primera en usarse, digamos que por ejemplo se usa: a558d24559fe35e7e8feadb080b92b339e2c42ce1808a96dfa4eb4045ce2c63f

Conociendola, se genera el hash SHA-256 de esta semilla inicial. Después, el casino genera el hash SHA-256 del hash de esa primera semilla, y procede a repetir este proceso 10 millones de veces.

Finalmente, tendremos 10 millones de hashes, pero cada uno es el hash SHA-256 del hash anterior. De esta forma, en lugar de publicar 10 millones de hashes en público, el casino solo tiene que proporcionar un hash, p. ej. el hash 10 millones antes de que el bloque #647000 se mine. Ahora el casino utilizará el hash 9,999,999 como semilla del servidor de la primera ronda. Tras acabar esta ronda, se libera el hash 9,999,999 al público. Con esto, los jugadores pueden comprobar que el hash SHA-256 9,999,999 es el mismo que el hash del hash 10,000,000. El proceso continua y el hash 9,999,998 será el siguiente en ser usado como semilla del servidor para la segunda ronda, tras la ronda se publicará el hash, y los jugadores podrán comprobar que el SHA-256 de este coincide con el 9,999,999.

De vuelta a nuestra partida de crash, el jugador apuesta antes de que el cohete despegue. Después tendrá que retirar su dinero antes de que el cohete explote. Por ejemplo, si el jugador apuesta 0.01BTC y el cohete despega, pincha el boton de “retirar” cuando hay un multiplicador 2.00x y el cohete no explota antes de llegar ahí, recibirá 0.01*2 = 0.02BTC. Sin embargo, si el cohete explota en, por ejemplo, 1.61x, perderá su apuesta de 0.01 BTC.

Para obtener el resultado de un juego de crash, los casinos pueden utilizar cualquier algoritmo; sin embargo, el HMAC-SHA512 es el más habitual. Veamos un ejemplo,

Semilla del servidor (o hash del juego) = 23f189fac071edfe0c2428ef151852efa9396d76f2447c8a1d80b3799d511eae

Semilla del cliente (o sal) = 0000000000000000000d81f8d41b31fa1fe08c1a3b723f32f656a2df52640b26

Como ya hemos explicado antes, el HMAC-SHA512 necesita dos puntos de entrada, una “clave” y un “mensaje”, en este caso, puede utilizar cualquier de ellos como mensaje, sin embargo, el hash de la partida es lo que se utiliza principalmente como mensaje y la sal como clave.

Si hacemos HMAC-SHA512(hashpartida,sal) = 4decd400c652bb7912622b3f74f15f81895203728fbe615a8ffc8c5433df5bd2de18a4b103384f896e45fa2cfbd34fbea4ace2fcf137fec9d1c47550d1b9645b

De esta secuencia, cogemos los primeros 13 caractéres para calcular el resultado, en nuestro caso, 4decd400c652b o 0x4decd400c652b (ya que es hexadecimal). Ahora tenemos que convertir este número hexadecimal en uno decimal; obteniendo 1370873031058731 como resultado.

Por último, utilizamos una formula especial. Cada casino utiliza su propia formula, pero la siguiente es la más popular y fue diseñada por el dueño de Bustadice:

Multiplicador = 99 / (1 – X)

donde X = número / 2^52

En nuestro ejemplo, número = 1370873031058731, por lo que el multiplicador será:

M = 99 / [1 – (1370873031058731/2^52)]

M = 1.42

Por lo tanto, el cohete explotará en 1.42x

Conclusión

Provably Fair Gaming

Esperamos haber sido capaces de aclarar un poco lo que el concepto de Provably fair es depues de que hayas leido esta guía. Sin embargo, como ya hemos mencionado varias veces, cada casino implementa su propia formula para aplicar el sistema provably fair. Algunos utilizan el HMAC-SHA512 mientras que otro usan el algoritmo SHA-512, algunon empiezan el nonce de 0 mientras que otros lo hacen desde 1, los algoritmos para los juegos de crash pueden ser distintos también. Por lo tanto, el proceso que hemos descrito puede no funcionar para cada casino. Para solucionar esto, hemos desarrollado una herramienta interna que verifica si una partida basada en provably fair ha sido justa o no; y esta herramienta está disponible para usarse en más de 25 casinos actualmente. Puedes utilizar esta herramienta para verificar tus apuestas y el resultado será automaticamente optimizado dependiendo de la implementación que el casino seleccionado utiliza: https://www.btcgosu.com/tools/provably-fair-verifier/.