Provably Fair
All multiplier game results have been predetermined. Before each round, we reveal a hash of the result, making it impossible for us to change the result after the fact. We created a chain of results, making it impossible for us to change future results. Before generating the chain of results, we revealed the 1st hash, published this on BitcoinTalk, and mixed in a future Bitcoin blockhash we could not have known. This makes all results provably fair.
Algorithm
Before the 1st round of the game began, we created a chain of hashes. The chain starts with a randomly chosen 256-bit value and every subsequent value is calculated using the SHA256 hash of the previous value.
Using a cryptographic hash function ensures that one can easily calculate any value in the chain using the previous value, but one can not easily calculate values in the reverse direction. The last value in the precalculated hash chain is what we publically published and used for the 1st round of the game. The 2nd round of the game used the second-to-last hash value, the 3rd round used the third-to-last hash value, etc. By traversing the chain in this manner, one can verify that the outcome of all past game rounds was consistent with the precalculated chain, but the outcome of future rounds remains unpredictable to users.
To eliminate the possibility that the chain was intentionally generated using an initial value that is biased in our favor, each value in the chain is hashed with the global seed using HMAC-SHA256 to create the final value that will determine the outcome of each game result. This global seed is set to the hash of the Bitcoin block that we announced prior to its mining. The inclusion of the global seed ensures that the outcome of the games was unknowable to us when the hash value of the 1st game was published.
Seeding Events
Example
Anyone can verify that the outcomes of all prior game rounds were generated using the provably fair algorithm with the following javascript code:
- // The global seed that is used by the multiplier game and published by Jacks Club
- const globalSeed = '00000000000000000000000000000000000000000000000000000000000000ff';
- // The game hash that belongs to the round you want to verify
- const gameHash = '00000000000000000000000000000000000000000000000000000000000000ee';
- // The seed that is used for the random number generator
- const randomBytes = CryptoJS.HmacSHA256(globalSeed, gameHash);