สำรวจ Cloudbet.com
certified checkmark stamp next to cloudbet logo

กลไกการทำงานของเกม Mines แบบยุติธรรมที่พิสูจน์ได้ใน Cloudbet เจาะลึกในเชิงเทคนิค


การพนันแบบยุติธรรมที่พิสูจน์ได้เข้ามาแก้ปัญหาที่เป็นเรื่องฝังลึกของคาสิโนออนไลน์มาตั้งแต่เริ่มก่อตั้ง นั่นคือ: ผู้เล่นจะเชื่อใจได้อย่างไรว่าผลลัพธ์ของเกมไม่ได้ถูกดัดแปลงแก้ไขในภายหลัง คำตอบคือเครื่องมือเดียวกันกับที่ผู้เชี่ยวชาญด้านการเข้ารหัสใช้ เมื่อใดก็ตามที่ทั้งสองฝ่ายจำเป็นต้องตกลงกันในเรื่องบางอย่างโดยไม่มีความเชื่อใจกัน ซึ่งก็คือระบบ Commit-Reveal

เนื้อหาต่อจากนี้คือการเจาะลึกขั้นตอนกระบวนการทั้งหมดที่ Cloudbet ใช้สำหรับเกม Mines ตั้งแต่การสร้าง Seed ไปจนถึงการวางตำแหน่งระเบิด และวิธีที่ผู้เล่นทุกคนที่มีความรู้ด้านการเขียนโค้ดเพียงเล็กน้อยก็สามารถตรวจสอบทุกผลลัพธ์ที่พวกเขาเคยเล่นได้อย่างอิสระ

บทความนี้เป็นบทความแรกในชุดบทความวิเคราะห์เชิงเทคนิคที่ได้วางแผนไว้ เกี่ยวกับกลไกผู้อยู่เบื้องหลังความยุติธรรมที่พิสูจน์ได้ของเกม Cloudbet Originals สำหรับการตรวจสอบรอบการเล่นด้วยตนเอง (รวมถึงเกม Mines) สามารถเข้าไปดูได้ที่เครื่องมือคำนวณความยุติธรรมที่พิสูจน์ได้ของ Cloudbet

การผูกมัดผลลัพธ์ก่อนเริ่มเล่น

ก่อนเริ่มการเล่นแต่ละรอบ เซิร์ฟเวอร์จะสร้าง Server Seed แบบสุ่มขนาด 32 ไบต์ และเผยแพร่ค่าแฮช SHA3-256 ทันที ซึ่งก็คือการผูกมัด (Commitment) แฮชนี้เป็นเสมือนรอยนิ้วมือแบบทางเดียว ที่ช่วยพิสูจน์ว่า Seed ดังกล่าวมีอยู่จริง ณ เวลานั้น โดยไม่เปิดเผยว่าค่าข้างในคืออะไร

เมื่อเกมสิ้นสุดลง Cloudbet จะเปิดเผยข้อมูล Server Seed ดิบ ซึ่งทุกคนสามารถนำไปแฮชและยืนยันว่าตรงกับค่าผูกมัดก่อนเริ่มเกมได้ สิ่งนี้จะพิสูจน์ว่า Seed และตำแหน่งการวางระเบิด ถูกกำหนดไว้คงที่แล้วก่อนที่จะมีการเลือกแผ่นป้ายแรก จึงไม่มีช่องว่างเวลาใดๆ ที่คาสิโนจะสามารถสลับเปลี่ยนค่าให้เป็นประโยชน์ต่อตัวเองได้มากกว่าเดิม

การผสมผสานค่าความแปรปรวนของผู้เล่น

หากใช้เพียง Server Seed อย่างเดียว จะทำให้ผู้เล่นต้องพึ่งพาการสุ่มของคาสิโนแต่เพียงฝ่ายเดียว เพื่อป้องกันสิ่งนั้น จึงมีการใส่ข้อมูลนำเข้าเพิ่มเติมอีกสองส่วนร่วมด้วย ได้แก่: Client Seed (ที่ตั้งค่าโดยผู้เล่น) และ Nonce (ตัวเลขจำนวนเต็มที่เพิ่มขึ้นในการเดิมพันแต่ละครั้ง)

ข้อมูลทั้งสามส่วนจะถูกนำมาต่อกันและแฮชด้วย SHA3-256 เพื่อสร้างลายเซ็นประจำรอบการเล่น (Round signature):

roundSignature = SHA3-256(`${serverSeed}:${clientSeed}:${nonce}`)

Client Seed จะช่วยให้มั่นใจได้ว่าคาสิโนจะไม่สามารถคาดเดาผลลัพธ์ล่วงหน้าในเวลาที่ทำข้อผูกมัดได้ เนื่องจากข้อมูลนำเข้าของผู้เล่นยังไม่เป็นที่รู้จักตอนที่ Server Seed ถูกสร้างขึ้น ส่วน Nonce จะช่วยให้มั่นใจได้ว่าในแต่ละรอบจะสร้างลายเซ็นที่แตกต่างกันอย่างชัดเจน แม้ว่า Seed ทั้งสองจะไม่มีการเปลี่ยนแปลงระหว่างการเดิมพันก็ตาม

การสร้างการสุ่มด้วย SHAKE256

ลายเซ็นประจำรอบการเล่นจะถูกส่งต่อไปยัง SHAKE256 ซึ่งเป็นฟังก์ชันที่สามารถขยายเอาต์พุตได้ (XOF) จากตระกูล SHA-3 ต่างจากแฮชมาตรฐานทั่วไป ตรงที่ XOF สามารถสร้างสตรีมไบต์แบบสุ่มเทียมที่มีความยาวเท่าใดก็ได้จากข้อมูลนำเข้าที่คงที่ ซึ่งมีประโยชน์ในที่นี้เนื่องจากการวางตำแหน่งระเบิดหลายลูกจำเป็นต้องใช้ค่าสุ่มที่เป็นอิสระต่อกันหลายค่า

กระบวนการทำงานจะดึงข้อมูลครั้งละ 4 ไบต์จากสตรีม เมื่อเอาต์พุตเริ่มต้นถูกใช้จนหมด ระบบจะเพิ่มคำว่า "next" ต่อท้ายสถานะและทำการบีบอัดข้อมูลอีกครั้ง อย่างไรก็ตาม ในทางปฏิบัติแล้ว ตารางขนาด 25 ช่องที่มีจำนวนระเบิดตามความจริง จะใช้ข้อมูลไม่เกิน 256 บิตแรกเท่านั้น

การวางตำแหน่งระเบิดโดยปราศจากอคติ: Rejection Sampling

การแปลงตัวเลขจำนวนเต็มแบบสุ่มขนาด 32 บิตให้อยู่ในตำแหน่งตารางโดยใช้การดำเนินการมอดุโล (Modulo) แบบง่ายๆ จะทำให้เกิดปัญหาเล็กๆ ที่ซ่อนอยู่แต่เกิดขึ้นจริง: เว้นแต่ว่า 2^32 จะถูกหารลงตัวด้วยจำนวนตำแหน่งที่เหลืออยู่ P ตำแหน่งบางตำแหน่งจะมีโอกาสถูกเลือกมากกว่าตำแหน่งอื่นเล็กน้อย

Cloudbet แก้ปัญหานี้ด้วยวิธี Rejection Sampling:

javascript
const maxAcceptable = Math.floor(0x100000000 / P) * P;
let rand;
do { rand = rng.next().value; } while (rand >= maxAcceptable);
const index = rand % P;

ค่าใดก็ตามที่อยู่นอกช่วงของตัวคูณที่ใหญ่ที่สุดของPซึ่งสามารถเก็บได้ใน 32 บิต จะถูกทิ้งไป และแทนที่ด้วยค่าถัดไปจากสตรีม SHAKE256 สิ่งที่เหลืออยู่คือการกระจายตัวแบบสม่ำเสมอในตำแหน่ง P ที่แน่นอนพอดี

หลังจากวางทุ่นระเบิดแต่ละลูกแล้ว ตำแหน่งนั้นจะถูกลบออกจากกลุ่ม และ P จะลดลง 1 ซึ่งเป็นการสับแบบ Fisher-Yates แบบบางส่วนบนอาร์เรย์ตารางแบบระนาบ 25 ส่วน

การตรวจสอบรอบ

การตรวจสอบหลังจากสิ้นสุดรอบเกมจำเป็นต้องใช้ค่าสี่ค่า ซึ่งทั้งหมดจะถูกเผยแพร่โดย Cloudbet หลังจบรอบการเล่น:

  • serverSeed
  • clientSeed
  • nonce
  • minePositions ที่ประกาศไว้

ขั้นตอนการตรวจสอบมีดังนี้:

  1. นำ serverSeed ไปแฮชด้วย SHA3-256 และยืนยันว่าตรงกับข้อผูกมัดก่อนเริ่มเกม
  2. ค้นหาค่า roundSignature = SHA3-256(serverSeed:clientSeed:nonce)
  3. เริ่มต้นระบบสตรีม SHAKE256 ด้วยค่า roundSignature แล้วรันลูปกระบวนการ Rejection Sampling เพื่อทำซ้ำ minePositions อย่างเป็นอิสระด้วยตนเอง

ผลลัพธ์ที่ตรงกันในการแข่งขันจะช่วยยืนยันว่าตารางไม่ได้ถูกดัดแปลงแก้ไขหลังจากรอบการเล่นได้เริ่มต้นขึ้น

ตัวอย่างการนำไปใช้ (Node.js)

bash
npm installjs-sha3
javascript
const crypto = require('crypto');
const { sha3_256, shake256 } = require('js-sha3');

function generateServerSeed() {
  const seed = crypto.randomBytes(32).toString('hex');
  return { serverSeed: seed, commitment: sha3_256(seed) };
}

function createRoundSignature(serverSeed, clientSeed, nonce) {
  return sha3_256(`${serverSeed}:${clientSeed}:${nonce}`);
}

function* createShake256Stream(signature) {
  const byteStream = shake256.create(32);
  byteStream.update(signature);
  while (true) {
    const buf = Buffer.from(byteStream.digest({ buffer: true }));
    for (let i = 0; i < buf.length; i += 4) {
      if (i + 4 <= buf.length) yield buf.readUInt32BE(i);
    }
    byteStream.update('next');
  }
}

function pickUniquePositions(count, totalTiles, rng) {
  const available = Array.from({ length: totalTiles }, (_, i) => i);
  const result = [];
  for (let i = 0; i < count; i++) {
    const P = available.length;
    const maxAcceptable = Math.floor(0x100000000 / P) * P;
    let rand;
    do { rand = rng.next().value; } while (rand >= maxAcceptable);
    const index = rand % P;
    result.push(available[index]);
    available.splice(index, 1);
  }
  return result;
}

const { serverSeed, commitment } = generateServerSeed();
const clientSeed = 'player-provided-seed';
const nonce = 0;
const sig = createRoundSignature(serverSeed, clientSeed, nonce);
const rng = createShake256Stream(sig);
const mines = pickUniquePositions(5, 25, rng);

console.log('Commitment:', commitment);
console.log('Server seed (post-game):', serverSeed);
console.log('Mine positions:', mines);

สิ่งที่ควรทราบ

ทำไมต้องใช้ SHA3 แทน SHA2 หากเป็นการผูกมัด (Commitment) แบบง่ายๆ ทั้งสองระบบสามารถใช้งานได้เหมือนกัน แต่โครงสร้างแบบสปอนจ์ (Sponge Construction) ของ SHA3 ช่วยขจัดปัญหาการโจมตีแบบขยายความยาว (Length-extension attacks) ได้ และการเลือกใช้ SHA3 ตลอดทั้งกระบวนการ ทั้งในส่วนของการผูกมัดและเป็นฐานสำหรับ SHAKE256 จะช่วยรักษาความสอดคล้องของระบบเข้ารหัสลับเอาไว้

ทำไมต้องใช้ SHAKE256 แทนที่จะเป็น PRNG แบบใส่ Seed การกำหนดล่วงหน้าและความสามารถในการตรวจสอบ เนื่องจาก SHAKE256 เป็นฟังก์ชันพื้นฐานมาตรฐานที่มีข้อกำหนดระบุไว้อย่างชัดเจน หมายความว่าการเขียนโค้ดใช้งานอย่างอิสระในภาษาใดๆ ก็ตาม จะสร้างเอาต์พุตที่เหมือนกันทุกประการจากข้อมูลนำเข้าชุดเดียวกัน ในขณะที่ PRNG แบบปรับแต่งเองจะนำพฤติกรรมเฉพาะตัวของระบบนั้นๆ เข้ามา ซึ่งทำให้บุคคลภายนอกตรวจสอบได้ยากขึ้น

ผู้เล่นสามารถเอาชนะระบบด้วยการเลือก Client Seed ที่เป็นประโยชน์ต่อตัวเองได้หรือไม่ ในทางทฤษฎีแล้วสามารถทำได้ โดยผู้เล่นอาจทดลองใช้ Client Seed แบบต่างๆ เพื่อค้นหาค่าที่สร้างตารางที่เป็นประโยชน์ต่อตนเอง สิ่งนี้ถือเป็นเรื่องที่ยอมรับได้ภายใต้การออกแบบระบบ: สิทธิ์ในการเลือก Seed ของผู้เล่นถือเป็นฟีเจอร์หนึ่ง ไม่ใช่ช่องโหว่แต่อย่างใด ความเสี่ยงของคาสิโนนั้นเท่าเทียมกันทั้งสองฝ่าย และที่สำคัญที่สุดคือ กลไกเดียวกันนี้ที่เปิดโอกาสให้ผู้เล่นเลือกค้นหา Seed ที่ดี ก็เป็นกลไกที่ช่วยให้พวกเขาพิสูจน์ได้เช่นกันว่าคาสิโนไม่มีวันเข้าแทรกแซงหรือปรับแต่งข้อมูลของพวกเขา

เกม Mines ถือเป็นจุดเริ่มต้นที่ดีสำหรับระบบการออกแบบที่โปร่งใสและตรวจสอบได้ เนื่องจากกระบวนการทำงานของ RNG นั้นค่อนข้างเบ็ดเสร็จในตัวเอง: มีรอบวัฏจักร Commit-Reveal เพียงรอบเดียว มีสตรีมไบต์ที่ตรงไปตรงมา และมีเทคนิคการสุ่มตัวอย่างที่เข้าใจง่าย เมื่อซีรีส์นี้ดำเนินไป เราจะเห็นว่า Cloudbet Originals อื่นๆ จะปรับใช้และขยายพื้นฐานเดียวกันนี้อย่างไร บางครั้งอาจมีแหล่งที่มาของค่าความแปรปรวนเพิ่มเติม,การจับคู่เอาต์พุตที่แตกต่างกัน หรือการตรวจสอบแบบหลายขั้นตอน โดยที่ยังคงรักษาการรับประกันหลักแบบเดิมเอาไว้: คือไม่มีผลลัพธ์ใดที่สามารถกำหนดได้หลังจากที่ผู้เล่นได้ตัดสินใจดำเนินการแล้ว

Share this post


You may also like

ชมคาสิโนและสปอร์ตบุ๊กของเราในรูปแบบการใช้งานจริง
Cloudbet Academy
Get smarter
Get rewarded

Complete free Academy lessons and earn exclusive promo codes.

Premier League
ตลาดเปิดแล้ว