KANITLANABILIR ADIL NEDIR?

Rocketpot Provably Fair algoritmalarını kullanır. Oyunun sonucunu aşağıda verilen kaynak kodu ile doğrulayabilirsiniz.

Provably Fair sistemi, hiç kimsenin, ne oyuncuların ne de sitenin operatörünün, oyun başlamadan önce oyunun sonucunu bilemeyeceğini ve hiç kimsenin oyunun rastgele sayılarını kurcalayamayacağını sağlamak için kullanılan matematiksel bir yöntemdir.


NASIL ÇALIŞIYOR?

Biz 8.000.000 SHA256 hash'ten oluşan bir zincir oluşturduk. Her bir eleman, bir önceki hash'in küçük harfli, onaltılık dize gösteriminin hash'idir.

Zincirin son öğesinin karması 5de24be2ba88f21070aca0b909a23ba8977a60e047e750dc6bd637aa3b4defc8

Her oyun zincirdeki bir hash ile eşleşir: Zincirin 8.000. 000'uncu öğesi 1 numaralı oyunun hash'idir ve zincirdeki ilk öğe #8.000.000 numaralı oyunun hash'idir.


NASIL DOĞRULANIR?

Bir hash'in #n numaralı oyuna ait olduğunu doğrulamak için, hash'i n kez hash'lemeniz ve sonucu sonlandırıcı hash ile karşılaştırmanız yeterlidir.

Bir oyunun sonucunu hash'inden hesaplamak için:

const CryptoJS = require("crypto-js");

function generateGameResultFromSeed(roundSeed, salt) {

  // Kullanılacak en anlamlı bit sayısı
  const nBitsToUse = 52;

  // Adım 1. HMAC_SHA256(message=seed, key=salt)
  const hmac = CryptoJS.HmacSHA256(roundSeed, salt);
  const roundHash = hmac.toString(CryptoJS.enc.Hex);

  // Adım 2. r = 52 en anlamlı bit
  const roundRandSource = roundHash.slice(0, nBitsToUse / 4);
  const r = parseInt(roundRandSource, 16);

  // Adım 3. Çarpışma = r / 2^52'yi hesaplayın, [0; 1) içinde eşit olarak dağıtılır
  const twoPower52 = Math.pow(2, nBitsToUse);
  let crash = r / twoPower52;

  // Adım 4. 100 - 100B aralığında normalleştirilmiş çökmeyi hesaplayın
  crash = Math.floor(97 / crash);
  crash = Math.min(crash, 100000000000);
  çökme = Math.max(çökme, 100);

  // Adım 5. Jackpot turunda oyuncu seçimi için sonraki 52 biti tohum olarak al
  const jpPlayerRandSource = roundHash.slice(nBitsToUse / 4, 2 * nBitsToUse / 4);
  const jpPlayerRandom = parseInt(jpPlayerRandSource, 16);

  // Adım 6. Çarkta Jackpot değerini seçmek için sonraki 52 biti tohum olarak alın
  const jpValueRandSource = roundHash.slice(2 * nBitsToUse / 4, 3 * nBitsToUse / 4);
  const jpValueRandom = parseInt(jpValueRandSource, 16);

  return {roundHash, jpPlayerRandom, jpValueRandom, crash, roundSeed};
}

İlgili sonucu hesaplamak için kullanılmadan önce, her oyun hash'i, bir bitcoin bloğunun hash'inin küçük harfli, onaltılık dize gösterimi ile tuzlanır.

Kullanılacak bloğun numarası, kazılmadan önce Bitcointalk forumunda (URL https://bitcointalk.org/index.php?topic=5178349) yayınlandı ve oyuncular için elverişsiz bir zinciri kasıtlı olarak seçmediğimizi kanıtladı.

Bu blok #591433 ve hash 0000000000000014ccc7303b1be1fd8c6b2cb5e961d57fbdc57f661db418

Madencilikten önce kullanılacak bloğun numarasını bitcointalk tohumlama etkinliği gönderisinin aşağıdaki anlık görüntülerinde yayınladığımız doğrulanabilir: https://archive.is/Mwq4s , http://loyce.club/archive/posts/5224/52246534.html ve https://archive.is/r8zCU (gönderiyi kazıyıp arşivlediği için LoyceV'ye teşekkürler!)


JACKPOT OYUNCU SEÇIMI VE ÇARK POZISYONLARI

Jackpot çarkı sonuçları aşağıdaki kod ile doğrulanabilir: https: //jsfiddle.net/7uackeqo/

Hazırlık adımları:

  • 1. Yuvarlak hash'i 3 parçaya bölün (her biri 52 bit).
  • 2. Her parçadan tamsayılar oluşturun.
  • 3. 1. kısım çarpan içindir (çarpma noktası).
  • 4. 2. kısım jackpot oyuncusunu seçmek içindir.
  • 5. 3. kısım jackpot çarkı dönüş sonucunu belirlemek içindir.

Yorum: Hash'ten bir tamsayı üretme işlemi herhangi bir çarpışma oyununa benzer, sadece 1 yerine 3 tamsayı üretiyoruz.

Oyuncu seçim adımları:

  • 1. Oyuncu listesini kullanıcı adlarına göre sıralayın (küçük harfe dönüştürün, yalnızca büyük/küçük harf farkı olan yinelenen adlara izin vermiyoruz).
  • 2. Tüm oyuncuların bahislerini toplam bahis değeri olarak toplayın.
  • 3. Bahsi toplam bahis değerinin %90'ından büyük olan bir oyuncu olup olmadığını kontrol edin.
    a. Böyle bir oyuncu yoksa, 4. adıma devam edin.
    b. Aksi takdirde - bu oyuncunun şansını %90 ile sınırlayarak bahisleri normalleştirin.
  • 4. Her oyuncuyu bahis miktarına, kullanıcı adına (sıralamadan sonra) ve toplam bahse (normalleştirmeden sonra, eğer böyle bir şey olduysa) göre değer aralığına atayın.
  • 5. Hazırlık adımı #4'teki değeri mersenne twister PRNG dizisi için bir tohum olarak kullanın.
  • 6. Mersenne Twister PRNG dizisinden toplam bahisten (2. adımdaki değer) daha düşük olan bir sonraki tarafsız değeri alın.
  • 7. Seçilen değer aralığında olan bir oyuncu seçin.

Yorum: Oyuncu seçim sürecini açıklamanın sezgisel bir yolu, her oyuncunun bahsin her satoshi'si başına 1 bilet almasıdır. Ve sonra hash zincirindeki değere göre bir bilet seçilir. Oyuncu listesi (oyuncu isimleri ve bahislerinden oluşur) ve tur hash'i göz önüne alındığında, herkes oyuncu seçim sonucunu doğrulayabilir. Tüm bahisler yapıldıktan sonra, operatörün oyuncu seçimini manipüle etmesinin bir yolu yoktur.

Çark döndürme adımları:

  • 1. Hazırlık adımı #5'teki değeri mersenne twister PRNG dizisi için bir tohum olarak kullanın.
  • 2. Mersenne Twister PRNG dizisinden jackpot çarkındaki sektör sayısından daha düşük olan bir sonraki tarafsız değeri alın.
  • 3. Seçilen değer bir respin sektörü ise, Mersenne Twister PRNG dizisinden bir sonraki yansız değeri alın ve respin olmayan sektör seçilene kadar tekrarlayın.

Yorum: Çark yapılandırması (sektör indeksleri ve değerleri) ve tur hash'i göz önüne alındığında, herkes çark dönüş sonucunu doğrulayabilir ve tohum olayı gerçekleştikten sonra dönüş sonucunu manipüle etmenin bir yolu yoktur.

Bu metin 24 Eylül 2019 tarihinde düzenlenmiştir.