Provably Fair

What is "Provably Fair"

Players always fear being cheated in online games.
This is understandable because it is technically very easy for an online game provider to make you lose. At Jemlit, we have a solution for this called provably fair. Provably fair is a tool that enables you (the player) to verify each roll result and make sure you are not being cheated!


How does Provably Fair work?

With this method each roll-result is calculated by the following variables:

  • Server Seed - A random string of characters provided by us
  • Client Seed - A string of characters generated by your browser that you can change
  • Nonce or Play Count - A number that increases each time you play

You will get an encrypted hash of the Server Seed before you start playing.
Since you get it in advance, we cannot change it later. However, it is encrypted, so you cannot calculate your own roll results in advance (only afterwards, if you get the unhashed Server Seed). The Server Seed is hashed using the SHA512 hashing algorithm.

Your browser will generate a random Client Seed. However, you can and should adjust this Client Seed before you start. This way you can make sure the site does not know your Client Seed in advance.

Now if you make a bet the Nonce starts with 1. After each bet you make, the nonce number will increase by 1.


Calculating the roll result

Now comes the nerdy stuff! There are 3 steps that bring us to the final rolled number of this game.

Step 1 - Hashing the variables

In this step, we calculate the HMAC with the SHA512/256 algorithm using the Server Seed as key, and the Client Seed and Nonce as the data, concatenated by a hypen (-).

You can calculate it by yourself; go here and run this code:
echo hash_hmac('sha512/256', 'your client seed-your nonce', 'server seed');
The result will be 38611068f6936027c4657138536fb5bb8f82a6cb2d883f1acb47cb24013f9e93

Step 2 - Converting the hash to a number

In step 2, we take the result we obtained in the previous step and we turn it into a number; go here and run this code:
echo number_format(hexdec('38611068f6936027c4657138536fb5bb8f82a6cb2d883f1acb47cb24013f9e93'), 0, ".", "");
You will get 25501016943689873370561741542489390377389678092728534236058081515070178721792, a very long number.

Step 3 - Calculating the final roll

Since we want to roll a decimal number between 0 and 100, first we divide the number in the previous step by the maximum possible number, which is 1664 (64 is the length of the hashed string of letters obtained in Step 1).
Finally, the roll is calculated:
roll = 0 + divided number * 100.
In this example, the result is 22.0231.


How is the prize chosen?

When you go to the page of an eBox, you can toggle the chances by clicking on Show chances, and you can see the rolls by clicking on "See rolls" at the bottom of the page.
For each item in the box, you will see the number you need to roll to win that prize, eg. 95.54 to 97.22. It means that if you roll a number higher than 95.54 and lower or equal to 97.22, you will get that prize.


How can I verify that everything is fair?

To verify that no cheating occurs, just follow the steps illustrated in the previous point.
Of course, you can only verify a game after you reveal the Server Seed.
You can find your Server Seed, Client Seed and Nonce in the "Fairness" popup at the top of the page (or in the top-left menu if you are accessing JemLit on your mobile).