TON Dice
Suomi
Pelaa

Todistettava reiluus

Jokaisen pelin tulos lyödään lukkoon ennen vetoa, ja kuka tahansa voi laskea sen uudelleen — meidän sanaamme ei tarvitse uskoa.

Miten se toimii

Kivijalkakasinolla näet kortin kääntyvän, nopan putoavan ja kiekon pyörivän. Verkossa se kaikki tapahtuu ohjelman sisällä — ja juuri ohjelma on se, joka pitää tarkistaa.

Ennen vetoa palvelin julkaisee salaisen siemenensä SHA-256-tiivisteen. Siementä ei voi vaihtaa jälkikäteen: tiiviste paljastaisi sen. Kun siemenpari vaihdetaan, vanha palvelimen siemen paljastetaan — ja jokaisen tuolla parilla tehdyn heiton voi laskea uudelleen alla olevalla kaavalla.

Alustan komissio on 1%. Voitto lasketaan kaavalla panos × 99 ÷ voittomahdollisuus prosentteina, eli pelaajalle palautuu 99% odotusarvosta. Se on ainoa asia, joka erottaa pelin reilusta kolikonheitosta; muuta ei pidätetä.

Siemenet

Siemenpari on sinun ja meidän. Palvelimen siemenen arvomme satunnaisesti ja näytämme sen tiivisteen heti: itse siemen pysyy salassa siemenparin vaihtoon asti, muuten tulevat heitot tiedettäisiin etukäteen. Asiakkaan siemenen asetat sinä, eikä ilman sitä yhtäkään heittoa voi laskea — tulos riippuu molemmista puolista.

Kolmas ainesosa on nonce, vedon järjestysnumero nykyisessä parissa. Se kasvaa yhdellä jokaisen pelin myötä, joten kahdella samalla parilla tehdyllä heitolla ei voi olla samoja lähtötietoja.

Miten luku syntyy

Palvelimen siemen, asiakkaan siemen ja nonce lasketaan yhteen HMAC-SHA512:lla. Syntyvät 128 heksamerkkiä luetaan viiden merkin ikkunoina: ensimmäisestä arvosta, joka alittaa 1 000 000, otetaan jakojäännös luvulla 10 000 — tuloksena heitto väliltä 0–9999, siis 0.00–99.99.

Hylkäysraja on olemassa reiluuden takia: viiden heksamerkin ikkuna antaa luvun väliltä 0–1 048 575, eikä tuo väli ole tasan jaollinen 10 000:lla — ilman hylkäämistä pienet tulokset osuisivat useammin kuin suuret. 1 000 000 on tasan jaollinen, joten kaikki 10 000 tulosta ovat yhtä todennäköisiä. Todennäköisyys sille, että kaikki 25 ikkunaa hylätään, on suuruusluokkaa 10⁻³³.

hex = HMAC_SHA512(key = serverSeed, msg = clientSeed + "-" + nonce)

Luetaan hex peräkkäisinä 5 merkin ikkunoina (0-4, 5-9, …):
ensimmäinen arvo < 1 000 000 → roll = arvo % 10000
(jos kaikki 25 ikkunaa hylätään — roll = 9999)

Alle: voitto kun roll < target · Yli: voitto kun roll > target
Maksu = panos × 9900 / chanceUnits (pyöristys alaspäin) · komissio 1%

Moottorin koodi

Täsmälleen tämä laskee heitot palvelimella, ja täsmälleen tämä laskee ne uudelleen selaimessasi. Sen, että puolet täsmäävät, varmistaa testi.

const WINDOW = 5;          // heksamerkkiä ikkunassa: 20 bittiä, 0..1048575
const REJECT = 1_000_000;  // suurin 10000:lla jaollinen luku ikkunan sisällä

function roll(serverSeed, clientSeed, nonce) {
  const hex = createHmac("sha512", serverSeed)
    .update(`${clientSeed}-${nonce}`)
    .digest("hex");                        // 128 merkkiä

  // peräkkäisiä 5 heksamerkin ikkunoita: 0-4, 5-9, ... 120-124
  for (let i = 0; i * WINDOW + WINDOW <= hex.length; i++) {
    const lucky = parseInt(hex.slice(i * WINDOW, i * WINDOW + WINDOW), 16);
    if (lucky < REJECT) return lucky % 10000;   // 0..9999
  }
  // kaikki 25 ikkunaa hylättiin (todennäköisyys ~1e-33)
  return 9999;
}

// maksu: 1% komissio, pyöristys alaspäin
const payout = (amount, chanceUnits) => amount * 9900n / BigInt(chanceUnits);

Miten tarkistat oman pelisi

Mini-sovelluksessa: Reiluus alapalkissa, tai ”Tarkista peli” minkä tahansa vedon kortissa.

  1. Välilehti ”Siemenet” — täällä on palvelimen nykyisen siemenen tiiviste. Se lyötiin lukkoon ennen vetojasi.
  2. Vaihda siemenpari. Edellinen palvelimen siemen paljastuu; oma siemenesi pysyy sinun.
  3. Välilehti ”Paljastetut” — paljastettu siemen on tiivisteensä vieressä. Tarkista: siemenen SHA-256:n on täsmättävä siihen, mikä näytettiin ennen vetoja.
  4. Välilehti ”Tarkista” — liitä palvelimen siemen, asiakkaan siemen ja kyseisen vedon nonce. Heitto lasketaan uudelleen suoraan selaimessasi ja sitä verrataan pelin tulokseen.

Laskenta tapahtuu sinun laitteellasi eikä ota yhteyttä palvelimeemme. Yllä olevalla kaavalla sen voi toistaa millä tahansa kielellä — HMAC-SHA512 löytyy kaikkialta.