Skip to content

Instantly share code, notes, and snippets.

@danielevns

danielevns/main.js

Last active Apr 28, 2020
Embed
What would you like to do?
bustabit.com v2 history generation
const { createHash, createHmac } = require("crypto");
const salt = "0000000000000000004d6ec16dafe9d8370958664c1dc422f452892264c59526"; // chosen in seeding event: https://bitcointalk.org/index.php?topic=2807542.msg28778130#msg28778130
let [id, hash] = process.argv.slice(2);
id = Number(id);
if (Number.isNaN(id) || !Number.isSafeInteger(id) || id < 1) {
printUsageMessage();
process.exit(1);
}
const isSha256Hash = /^[0-9a-f]{64}$/i.test(hash);
if (!isSha256Hash) {
printUsageMessage();
process.exit(1);
}
hash = Buffer.from(hash, "hex");
console.log("id,hash,result");
for (; id > 0; id--) {
const result = gameResult(hash, salt);
console.log(`${id},${hash.toString("hex")},${result}`);
hash = sha256(hash.toString("hex"));
}
console.error(`The terminating hash is ${hash.toString("hex")}.`);
function gameResult(seed, salt) {
const nBits = 52; // number of most significant bits to use
// 1. HMAC_SHA256(key=salt, message=seed)
const hmac = createHmac("sha256", salt);
hmac.update(seed);
seed = hmac.digest("hex");
// 2. r = 52 most significant bits
seed = seed.slice(0, nBits / 4);
const r = parseInt(seed, 16);
// 3. X = r / 2^52
let X = r / Math.pow(2, nBits); // uniformly distributed in [0; 1)
// 4. X = 99 / (1-X)
X = 99 / (1 - X);
// 5. return max(trunc(X), 100)
const result = Math.floor(X);
return Math.max(1, result / 100);
}
function printUsageMessage() {
console.error(`Usage: node main.js <game_id> <hash>
Example: node main.js 1152006 01ad6c6988689c103b4cf6ed84e8a14b1c38ef48c26abc44fb97874f36be4e02`);
}
function sha256(value) {
return createHash("sha256")
.update(value)
.digest();
}
@partha-sarkar

This comment has been minimized.

Copy link

@partha-sarkar partha-sarkar commented Apr 28, 2020

bal

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.