Plinko'da provably fair nasıl çalışır

Cloudbet'te Plinko'yu nasıl oynayacağınızı ve her topun yolunun provably fair olduğunu nasıl kontrol edeceğinizi burada bulabilirsiniz.

Plinko nasıl oynanır

Plinko, bir topu bir piramit şeklindeki pimlerden aşağı bıraktığınız ve bir ödemeye doğru sekmesini izlediğiniz bir şans oyunudur. Bırakmadan önce, bahis miktarınızı, piramidin kaç sıraya sahip olacağını ve bir risk seviyesini belirlersiniz. Devrede daha fazla sıra ve daha yüksek risk, olası çarpanları büyütür — ama onlara ulaşmak da o kadar zorlaşır. Topu bıraktığınızda, her pim sırasından sola veya sağa sekerek alt taraftaki, her biri kendi çarpanına sahip kovalardan birine düşene kadar ilerler. Birçok Plinko oyunu, daha hızlı oynamak için aynı anda birden fazla top bırakmanıza izin verir.

Cloudbet Originals Plinko

Cloudbet'in kendi Originals Plinko'su 8, 10, 12 veya 16 sıra, dört risk seviyesi (Düşük, Orta, Yüksek, Aşırı) ve bırakış başına 1, 5, 10, 20, 50 veya 100 top seçmenize izin verir. %99 RTP'ye sahiptir. İsteğe bağlı BOOST özelliği (bahsinize %20'lik bir ek ücret) özel 2x, 5x ve 10x top çarpanları ekler ve maksimum çarpanı 100.000x'e çıkarır — toplam ödeme 1.000.000 $ ile sınırlıdır.

Provably fair'in genel tanıtımı için — sunucu tohumları, müşteri tohumları, nonce'lar, hashleme ve bir sonucun nasıl doğrulanacağı — Cloudbet'in provably fair sistemine bakın. Aşağıda bunun Plinko'ya özel olarak nasıl uygulandığı anlatılmaktadır.

Bir topun yolu nasıl bir kovaya dönüşür

Her topun piramitten aşağı yolu, pimlerden bir dizi sekmedir ve her sekme ya sola ya da sağa doğrudur.

Cloudbet'in kanıtlanabilir adil Plinko oyunundaki her sekmenin sola veya sağa doğru bir seçim olarak nasıl kodlandığını gösteren diyagram.

Bu seçim "0" (sola) veya "1" (sağa) olarak kodlanabilir. "Sola, sola, sağa" gibi bir yol, "001" koduna dönüşür ve bu yolu izlemek topu 2 numaralı Kova'ya düşürür.

Cloudbet'in kanıtlanabilir adil sistemi altında bir Plinko topunun yolunun 0'lar ve 1'lerden oluşan bir dizi olarak kodlanmasını ve topun 2 numaralı bölmeye düşmesini gösteren örnek.

İşte temel örüntü: bir yol, sağa doğru sekme sayısına artı bir eklenmiş sayıya karşılık gelen kovaya düşer. Yani tam olarak bir "1"e sahip "100", "010" ve "001" — hepsi 2 numaralı Kova'ya düşer (1 + 1).

Matematiksel olarak hepsi aynı bölmeye düşen, birbirinden farklı çok sayıda kanıtlanabilir adil Plinko top yolunu gösteren diyagram.

Bu, rastgele bir yolun tek bir adımda üretilip kodlanabileceği anlamına gelir: 32 bitlik rastgele bir sayı alın, ilk N bitini okuyun (N sıra sayısıdır) ve bu bitlerden kaçının "1" olduğunu sayın. Bir ekleyin, işte topun düştüğü kova bu. Kova, tur başlamadan önce sunucuda hesaplanır ve kilitlenir, tur sona erene kadar gizli tutulur ve ardından açıklanır.

Kendi Plinko oyunlarınızın provably fair niteliğini doğrulayın

Aşağıdaki kod, Cloudbet'in Plinko uygulamasıyla birebir aynıdır. Sunucu Tohumunuzu, Müşteri Tohumunuzu, Nonce'unuzu, top sayınızı ve sıra sayınızı girin, tek bağımlılığı kurun ve çalıştırın.

npm install js-sha3

Bağımlılığı kurduktan sonra, kendi verilerinizi aşağıdaki kod bloğuna girin.

// If you are running this yourself, then you can input your own data here
// You can then compare:
// 1) Cloudbet's provided Commitment to the Commitment outputted here. This proves that the Server Seed was not altered during gameplay.
// 2) Cloudbet's provided game outcome to the game outcome outputted here. This proves that your game's outcome was determined solely by the pre-game seeds and was not altered afterwards.
let myServerSeed      = 'your_server_seed'; // ✍️YOUR_INPUT✍️: Enter your (unhashed) Server Seed here
let myClientSeed      = 'your_client_seed'; // ✍️YOUR_INPUT✍️: Enter your Client Seed here
let myNonce           = 1;                  // ✍️YOUR_INPUT✍️: Enter your Nonce here
let myNumberOfBalls   = 1;                  // ✍️YOUR_INPUT✍️: Enter your number of balls here
let myNumberOfRows    = 12;                 // ✍️YOUR_INPUT✍️: Enter your number of rows here
const usingCustomData = false;              // Change this to true if you are using your own data

// Load libraries
const crypto = require('crypto');
const { sha3_256, shake256 } = require('js-sha3');

// Step 1: Generate a Server Seed and Commitment
// And generate a Client Seed - either by player input or by the player's browser
function generateServerSeed() {
  let seed = crypto.randomBytes(32).toString('hex');
  if (usingCustomData) { seed = myServerSeed; }
  const commitment = sha3_256(seed);
  return { 'serverSeed': seed, 'commitment': commitment };
}
function getClientSeed() {
  let seed = crypto.randomBytes(32).toString('hex');
  if (usingCustomData) { seed = myClientSeed; }
  return seed;
}

// Step 2: Create a Round Signature with SHA3 using a Server Seed, Client Seed and Nonce 
function createRoundSignature(serverSeed, clientSeed, nonce) {
  return sha3_256(`${serverSeed}:${clientSeed}:${nonce}`);
}

// Step 3: Create a SHAKE256 stream generator from a Round Signature. 
// To simplify this example program, this function doesn't create a stream, but instead a sequence with a custom length.
function* createRandomNumberSequence(numbersToGenerate, roundSignature) {
  const numOfBytes = 4 * numbersToGenerate;           // 4 bytes (32 bits) per random number we generate
  const byteStream = shake256.create(8 * numOfBytes); // shake takes bits as input
  byteStream.update(roundSignature);                  // Use the Round Signature to seed the generator
  const buf = Buffer.from(byteStream.digest());       // The Buffer class lets us package every 4 bytes into one 32-bit integer
  for (let i = 0; i < numbersToGenerate; i++) {
    yield buf.readUInt32BE(i * 4);                    // Read buf in 4-byte steps
  }
  throw new Error("No more numbers in the random number sequence! Fix: make 'numbersToGenerate' larger.");
}

// Step 4: Sample bits to determine ball paths
function pickBuckets(numOfRows, numOfBalls, rng) {
  let bucketIndices = [];
  for (let i = 0; i < numOfBalls; i++) {
    const rawUint32 = rng.next().value;
    let pathArray = rawUint32.toString(2).padStart(32, '0').split("");  // Convert the number into an array of bits
    pathArray.splice(numOfRows);                                        // Select the the first bits for the number of rows
    bucketIndices.push(getBucketIndexFromPath(pathArray));
  }
  return bucketIndices;
}

// Calculates which bucket the ball would land in an array of 1's and 0's where 0 = leftwards, 1 = rightwards
// In principle it counts the amount of times the ball bounces rightwards
function getBucketIndexFromPath(pathArray) {
  let rightCounter = 0;
  for(let i = 0; i < pathArray.length; ++i) {
    if (pathArray[i] === '1') {
      rightCounter += 1;
    } else {
      rightCounter += 0;
    }
  }
  return rightCounter + 1; // Add one so that the left-most bucket is bucket number one
}

// Example usage
(function main() {
  let numOfRows = 12;
  let numOfBalls = 1;
  let nonce = 1;
  if (usingCustomData) { numOfRows = myNumberOfRows; numOfBalls = myNumberOfBalls; nonce = myNonce; }

  const { serverSeed, commitment } = generateServerSeed();
  const clientSeed = getClientSeed();

  const roundSignature = createRoundSignature(serverSeed, clientSeed, nonce);
  const numbersToGenerate = numOfBalls; // Only need to generate one number per ball
  const rng = createRandomNumberSequence(numbersToGenerate, roundSignature); 

  const bucketIndices = pickBuckets(numOfRows, numOfBalls, rng);

  console.log('📝 Commitment (shown before the game):', commitment);
  console.log('🔒 Server Seed (revealed after the game):', serverSeed);
  console.log('🎲 Client Seed:', clientSeed);
  console.log('🔢 Nonce:', nonce);
  console.log('🔁 Round Signature (can be verified after the game):', roundSignature);
  console.log('📋 Number of rows:', numOfRows);
  console.log('🏁 Buckets landed in (Bucket #1 is the leftern-most bucket):', bucketIndices);
})();

Not: Cloudbet'te bir oyunun Sunucu Tohumunu açığa çıkarmak için önce yeni bir Sunucu Tohumuna geçmeniz gerekir.

Diğer provably fair oyun anlatımları:

  1. Provably fair Mines
  2. Provably fair Pump
  3. Provably fair Dice
  4. Provably fair Dice: Golden Ticket
  5. Provably fair Limbo
  6. Provably fair Roulette
  7. Provably fair Keno