) when this was posted. The block hash:
.
The reference code (javascript) is as follows:
function genGameHash(serverSeed) {
return crypto.createHash('sha256').update(serverSeed).digest('hex');
}
The method to convert a game hash, mix it with the picked client seed to a money pot multiplier:
function toFixed(num, fixed) {
var re = new RegExp('^-?\\d+(?:\.\\d{0,' + (fixed || -1) + '})?');
return num.toString().match(re)[0];
}
function crashPointFromHash(serverSeed, clientSeed) {
var actual_hash = CryptoJS.SHA512(clientSeed + "-" + serverSeed).toString();
var p1 = parseInt((actual_hash.substr(0, 2) + '').replace(/[^a-f0-9]/gi, ''), 16);
var p2 = parseInt((actual_hash.substr(2, 2) + '').replace(/[^a-f0-9]/gi, ''), 16);
var p3 = parseInt((actual_hash.substr(4, 2) + '').replace(/[^a-f0-9]/gi, ''), 16);
var p4 = parseInt((actual_hash.substr(6, 2) + '').replace(/[^a-f0-9]/gi, ''), 16);
var roll = Math.floor(((p1 / Math.pow(256, 1)) + (p2 / Math.pow(256, 2)) + (p3 / Math.pow(256, 3)) + (p4 / Math.pow(256, 4))) * 1000000);
var crash_point = toFixed(parseFloat(1000000 / (roll + 1) * 0.96), 2);
return crash_point;
}
The chain could be generated with code such as:
var serverSecret = 'If you knew this, you could steal all my money';
var clientSeed = '0000examplehash';
var gamesToGenerate = 1e7;
var serverSeed = serverSecret;
for (var game = gamesToGenerate; game > 0; --game) {
serverSeed = genGameHash(serverSeed);
console.log('Game ' + game + ' has a crash point of ' + (crashPointFromHash(serverSeed, clientSeed) / 100).toFixed(2) +'x', '\t\tHash: ' + serverSeed);
}
var terminatingHash = genGameHash(serverSeed);
console.log('The terminating hash is: ', terminatingHash);
Using our chosen starting serverSeed, the hash terminating the chain is
96bd217bd55f07aba2980b59210eaa27a9b302e17617092be7fea3e232132f41. That is to say, the first game's hash played under the new provably fair scheme, when hashed will be
96bd217bd55f07aba2980b59210eaa27a9b302e17617092be7fea3e232132f41.
OP shouldn't edit his post.