For each verifiable game, a client
seed, a server seed, a nonce and a cursor are used as the input parameters for the
random number generation function. This function utilises the cryptographic hash function
HMAC_SHA256 to generate bytes which are then used as the foundation for how we generate
provably fair random outcomes on our platform.
// Random number generation based on following inputs: serverSeed, clientSeed, nonce and cursor
function byteGenerator({ serverSeed, clientSeed, nonce, cursor }) {
// Setup curser variables
let currentRound = Math.floor(cursor / 32);
let currentRoundCursor = cursor;
currentRoundCursor -= currentRound * 32;
// Generate outputs until cursor requirement fullfilled
while (true) {
// HMAC function used to output provided inputs into bytes
const hmac = createHmac('sha256', serverSeed);
hmac.update(`${clientSeed}:${nonce}:${currentRound}`);
const buffer = hmac.digest();
// Update curser for next iteration of loop
while (currentRoundCursor < 32) {
yield Number(buffer[currentRoundCursor]);
currentRoundCursor += 1;
}
currentRoundCursor = 0;
currentRound += 1;
}
}
Server Seed
The server seed is generated by our system as a random 64-character hex string. You are then
provided with an encrypted hash of that generated server seed before you play any games. The reason we provide you with the encrypted form of the
server seed is to ensure that the un-hashed server seed cannot be changed by the casino
operator, and that the customer cannot calculate
the results beforehand.
To reveal the server seed from its hashed version, the seed must be rotated by the customer, which triggers the replacement with a newly generated one.
From this point you are able to verify that the hashed server seed matches that of the un-hashed
server seed. This process can be verified via our un-hashed server seed function found in the
menu above.
Client Seed
The client seed belongs to the customer.
All customers are free to edit and change
their client seed regularly to create a new chain of random upcoming outcomes.
You can do this via the fairness modal.
Nonce
The nonce is simply a number that increments as every new game is played.
The implementation of nonce, ensures we remain committed to your client seed and server seed
pair, whilst generating new results for each game played.
Cursor (Incremental Number)
We use 4 bytes of data to generate a single game result, and because SHA256 is limited to 32
bytes, we utilise this implementation of a cursor to give us the ability to create more game
events without having to modify our provable fair algorithm.
The cursor is only iterated over when the game being played requires the generation of more than
8 (32 bytes / 4 bytes) possible outcomes. For example: when we need to use more than 8 cards in
a game of blackjack.
The cursor starts as 0 and gets increased by 1 every time the 32 bytes are returned by the
HMAC_SHA256 function. If we don’t require more than 8 random numbers to be generated for the
game events, then the curser does not increment as there is no need to generate any additional
possible game outcomes.
Games with more than 1 incremental number:
Hilo (Unlimited to cover required amount of cards)
Keno (2 increments for every game due to 10 possible outcomes)
Mines (3 increments per game for 24 possible bomb locations)
Plinko (2 increments per game to cover possible 16 decisions)
Blackjack (Unlimited to cover required amount of cards)
Video Poker (7 increments to generate 52 possible cards in a full deck)
Diamond Poker (2 increments to cover 10 diamonds: 5 per customer/dealer)
Slots (The incremental number is only utilised for bonus rounds)
Games with only 1 incremental number (represented as default value 0):