Jeux personnalisés - Provably Fair
Comment il est utilisé dans les jeux personnalisés
Chaque pari sur un Yeet Original démarre à partir d'une « round seed » (graine de tour). La round seed est un HMAC-SHA256 combinant ta client seed et le nonce du pari, crypté avec une server seed choisie par YEET. Le jeu tire ensuite chaque valeur aléatoire nécessaire au pari depuis cette round seed. La server seed t'est montrée sous forme hachée avant de jouer et est révélée lorsque tu changes ta paire de seeds, afin que tu puisses recalculer la round seed de n'importe quel pari passé et vérifier que le résultat n'a pas été modifié après ta mise.
Les autres vérificateurs peuvent ne pas correspondre
Les sites de vérification conçus pour d'autres casinos peuvent générer des nombres aléatoires différemment, donc vérifier un pari YEET ailleurs peut donner un résultat différent. Vérifie tes paris YEET dans l'onglet Vérification de la fenêtre d'équité du jeu, ou avec le code sur cette page.
Conversions
Une conversion transforme l'entropie de la graine de la manche en un résultat de jeu. Le principe de base est le même dans chaque Original : unbiasedUint choisit l'une des n positions équiprobables, et le jeu vérifie si cette position gagne. Une étape avec s positions gagnantes sur n a une probabilité de s / n.
Cette page ne liste pas la conversion pour chaque jeu. L'exemple ci-dessous illustre le modèle avec un jeu.
Exemple : Lamb Chop
Lamb Chop comporte 16 sauts, et chaque saut correspond à un tirage à partir de la même graine de tour. Au saut h, la ligne compte totalStart − h positions, dont safeStart − h sont sûres. Un lancer inférieur au nombre de positions sûres permet de survivre. Le premier lancer qui échoue met fin au tour, et le multiplicateur est lu sur la table des gains selon le nombre de sauts réussis.
const LAMB_CHOP_TOTAL_HOPS = 16;
const LAMB_CHOP_LANES = {
easy: [19, 21],
medium: [19, 23],
hard: [19, 25],
very_hard: [19, 27],
death_wish: [20, 32],
};
const LAMB_CHOP_PAYTABLE = {
easy: [
1.0721, 1.1912, 1.3313, 1.4977, 1.6975, 1.94, 2.2384, 2.6115,
3.0863, 3.7036, 4.5266, 5.6583, 7.275, 9.7, 13.58, 20.37,
],
medium: [
1.1742, 1.4351, 1.7728, 2.216, 2.8069, 3.6089, 4.7194, 6.2925,
8.5807, 12.013, 17.3522, 26.0283, 40.9016, 68.1694, 122.705, 245.41,
],
hard: [
1.2763, 1.7017, 2.3023, 3.1657, 4.432, 6.3315, 9.2537, 13.8806,
21.4519, 34.323, 57.2051, 100.1089, 185.9166, 371.8333, 818.0333, 2045.0833,
],
very_hard: [
1.3784, 1.991, 2.928, 4.392, 6.7344, 10.5826, 17.0951, 28.4918,
49.2132, 88.5838, 167.325, 334.65, 717.1071, 1673.25, 4350.45, 13051.35,
],
death_wish: [
1.552, 2.5322, 4.2203, 7.1994, 12.5989, 22.6781, 42.1166, 80.9934,
161.9869, 338.7, 745.1401, 1738.6604, 4346.651, 11798.0529, 35394.1588, 120340.14,
],
};
async function verifyLambChopBet(serverSeed, clientSeed, nonce, volatility) {
const seed = await deriveGameSeed(serverSeed, clientSeed, nonce);
const result = await verifyLambChopFromSeed(seed, volatility);
return { serverSeed, clientSeed, nonce, ...result };
}
async function verifyLambChopFromSeed(seed, volatility) {
const lane = LAMB_CHOP_LANES[volatility];
if (!lane) throw new Error(`No lamb-chop lane geometry for risk profile '${volatility}'.`);
const [safeStart, totalStart] = lane;
const entropy = new GameEntropy(hexToBytes(seed));
const hops = [];
let bustIndex = LAMB_CHOP_TOTAL_HOPS;
for (let hop = 0; hop < LAMB_CHOP_TOTAL_HOPS; hop++) {
const safePositions = safeStart - hop;
const totalPositions = totalStart - hop;
const roll = await unbiasedUint(entropy, totalPositions);
const survived = roll < safePositions;
hops.push({
hop,
safePositions,
totalPositions,
chance: safePositions / totalPositions,
roll,
survived,
});
if (!survived) {
bustIndex = hop;
break;
}
}
return {
seed,
entropyCursor: entropy.cursor,
volatility,
hops,
bustIndex,
clearedAllHops: bustIndex >= LAMB_CHOP_TOTAL_HOPS,
maxReachableMultiplier: lambChopMultiplierFor(volatility, bustIndex),
paytable: LAMB_CHOP_PAYTABLE[volatility],
};
}
function lambChopMultiplierFor(volatility, hopCount) {
if (hopCount < 1) return 0;
const row = LAMB_CHOP_PAYTABLE[volatility];
if (!row) throw new Error(`No lamb-chop paytable for risk profile '${volatility}'.`);
const multiplier = row[hopCount - 1];
if (multiplier === undefined) {
throw new Error(`No lamb-chop paytable row for ${volatility} at ${hopCount} hop(s).`);
}
return multiplier;
}
// Use the revealed server seed (64 hex characters) and the client seed and nonce shown on the bet.
console.log(await verifyLambChopBet(
'REVEALED_SERVER_SEED',
'yeetdemo-7f3a91',
'1842',
'easy'
));