สรุป

การแก้ไขปัญหาความน่าเชื่อถือกับการพนันออนไลน์

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

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

สิ่งนี้ถูกทำให้เข้าใจง่ายในตัวแทนต่อไปนี้:
ผลลัพธ์ที่ยุติธรรม = อินพุตของผู้ดำเนินการ (แฮช) อินพุตของผู้เล่น

การประยุกต์ใช้

การสร้างตัวเลขสุ่ม

สำหรับการเดิมพันที่สามารถตรวจสอบได้, seed ของลูกค้า, seed ของเซิร์ฟเวอร์, nonce และ cursor ถูกใช้เป็นพารามิเตอร์อินพุตสำหรับ การสร้างตัวเลขสุ่ม ฟังก์ชัน HMAC_SHA256 เพื่อสร้างไบต์ที่ใช้เป็นพื้นฐานในการสร้างผลลัพธ์สุ่มที่พิสูจน์ได้ว่าเป็นธรรมในแพลตฟอร์มของเรา


// การสร้างตัวเลขสุ่มโดยอิงจากอินพุตต่อไปนี้: serverSeed, clientSeed, nonce และ cursor
function byteGenerator({ serverSeed, clientSeed, nonce, cursor }) {

// กำหนดตัวแปรคำสาป
let currentRound = Math.floor(cursor / 32);
let currentRoundCursor = cursor;
currentRoundCursor -= currentRound * 32;

// สร้างเอาท์พุตจนกว่าความต้องการของ cursor จะเสร็จสิ้น
while (true) {

// ฟังก์ชัน HMAC ถูกใช้เพื่อแสดงอินพุตที่ให้มาเป็นไบต์
const hmac = createHmac("sha256", serverSeed);
const buffer = hmac.digest();

// อัปเดต cursor สำหรับการวนลูปครั้งถัดไป
while (currentRoundCursor < 32) {
result.push(buffer[currentRoundCursor]);
currentRoundCursor = 1;
}

currentRoundCursor = 0;
currentRound += 1;
}
}


เซิร์ฟเวอร์ Seed

เซิร์ฟเวอร์ Seed ถูกสร้างโดยระบบของเราเป็นสตริง 64 ตัวอักษรแบบสุ่มในรูปแบบฐานสิบหก

เพื่อเปิดเผยเซิร์ฟเวอร์ Seed จากเวอร์ชันแฮชของมัน, seed ต้องถูกหมุนโดยผู้เล่น ซึ่งทำให้เกิดการแทนที่ด้วย seed ใหม่ที่สร้างขึ้น

ตั้งแต่ตอนนี้ คุณสามารถตรวจสอบว่าเซิร์ฟเวอร์ Seed ที่แฮชตรงกับเซิร์ฟเวอร์ Seed ที่ไม่แฮช

Client Seed

Client Seed เป็นของผู้เล่นและใช้เพื่อให้มั่นใจว่าผู้เล่นก็มีอิทธิพลต่อความสุ่มของผลลัพธ์ที่เกิดขึ้น

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

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

คุณสามารถทำเช่นนี้ได้ผ่านทางโมดัลความยุติธรรม

Client Seed

Nonce เป็นเพียงตัวเลขที่เพิ่มขึ้นเมื่อการเดิมพันใหม่ถูกทำขึ้น

การใช้งาน Nonce, ทำให้เรายังคงยึดมั่นกับเซิร์ฟเวอร์ Seed และคู่ของ Client Seed ของคุณ, ในขณะที่สร้างผลลัพธ์ใหม่สำหรับการเดิมพันแต่ละรายการที่ทำ

Client Seed

เราใช้ข้อมูล 4 ไบต์เพื่อสร้างผลลัพธ์เกมหนึ่ง, และเนื่องจาก SHA256 จำกัดที่ 32 ไบต์, เราใช้การใช้งาน cursor นี้เพื่อให้เราสามารถสร้างเหตุการณ์เกมมากขึ้นโดยไม่ต้องแก้ไขอัลกอริธึมความยุติธรรมที่พิสูจน์ได้

Cursor จะถูกวนซ้ำเมื่อเกมที่เล่นต้องการผลลัพธ์มากกว่า 8 (32 ไบต์ / 4 ไบต์) ผลลัพธ์ที่เป็นไปได้

Cursor เริ่มจาก 0 และเพิ่มขึ้น 1 ทุกครั้งที่ 32 ไบต์ถูกส่งคืนโดยฟังก์ชัน HMAC_SHA256

เกมที่มีตัวเลขเพิ่มขึ้นมากกว่า 1 ตัว:
  • Hilo (ไม่จำกัดเพื่อครอบคลุมจำนวนไพ่ที่จำเป็น)
  • Keno (2 เพิ่มขึ้นสำหรับแต่ละเกมเนื่องจากผลลัพธ์ที่เป็นไปได้ 10 อย่าง)
  • Mines (3 เพิ่มขึ้นต่อเกมสำหรับ 24 ตำแหน่งระเบิดที่เป็นไปได้)
  • Plinko (2 เพิ่มขึ้นต่อเกมเพื่อครอบคลุมการตัดสินใจที่เป็นไปได้ 16 อย่าง)
  • Blackjack (ไม่จำกัดเพื่อครอบคลุมจำนวนไพ่ที่จำเป็น)
  • Video Poker (7 เพิ่มขึ้นเพื่อสร้าง 52 การ์ดที่เป็นไปได้ในสำรับเต็ม)
  • Diamond Poker (2 เพิ่มขึ้นเพื่อครอบคลุม 10 เพชร: 5 ต่อผู้เล่น/ดีลเลอร์)
  • Slot (ตัวเลขเพิ่มเติมจะใช้เฉพาะในรอบโบนัส)
เกมที่มีตัวเลขเพิ่มขึ้นเพียง 1 ตัว (แสดงเป็นค่าเริ่มต้น 0):
  • ลูกเต๋า
  • Limbo
  • Wheel
  • Baccarat
  • Roulette
  • Diamonds

การสนทนา

Byte ไปที่ Float
ผลลัพธ์จากฟังก์ชัน Random Number Generator (byteGenerator) คือแฮช 32 ไบต์ในรูปแบบฐานสิบหก

// เปลี่ยนแฮชเอาท์พุตจาก rng byteGenerator เป็น float

function generateFloats ({serverSeed, clientSeed, nonce, cursor, count}) {

// ฟังก์ชันสร้างตัวเลขสุ่ม

const rng = byteGenerator({ serverSeed, clientSeed, nonce, cursor });

// ประกาศ byte เป็นอาร์เรย์ว่าง

const byte = [];

// เติมอาร์เรย์ byte ด้วยชุด 4 จากเอาท์พุต RNG
while (byte.length < count * 4) { byte.push(rng.next().value);
}
// คืนค่า byte เป็น float โดยใช้ฟังก์ชันการลบของ lodash

return _.chunk(byte, 4).map(bytesChunk =>

bytesChunk.reduce((result, value, i) => {

const divisor = 256 ** (i + 1);

const partialResult = value / divisor;

return result + partialResult;

}, 0)
);
};
จาก Float ไปยังเหตุการณ์เกม
กระบวนการสร้างเอาท์พุตสุ่มนั้นเป็นสากลสำหรับทุกเกมของเรา, ณ จุดนี้ในการสร้างผลลัพธ์เกมที่กระบวนการเฉพาะถูกนำมาใช้เพื่อกำหนดการแปลจาก float ไปยังเหตุการณ์เกม

Float แบบสุ่มที่ถูกสร้างขึ้นจะถูกคูณด้วยความน่าจะเป็นของผลลัพธ์ที่เหลือจากเกมที่กำลังเล่น

เหตุการณ์เกมสุ่ม
สำหรับเกมเช่น Keno, Mines, และ Video Poker, ซึ่งผลลัพธ์ไม่สามารถทำซ้ำได้, เราจะใช้ขั้นตอนการสุ่ม Fisher-Yates

ตัวอย่างเช่น, ใน Video Poker, ตอนแรกมี 52 การ์ดที่มีอยู่ในสำรับทั้งหมด, ดังนั้นเหตุการณ์เกมแรกจะถูกแปลโดยการคูณ float กับ 52. หลังจากแจกการ์ดนี้, จะเหลือการ์ด 51 ใบใน

เกี่ยวกับ Mines และ Keno, นี่ก็แค่การใช้กระบวนการเดียวกันที่อธิบายไว้ใน Video Poker แต่เปลี่ยนไปเป็นกระเบื้องหรือตำแหน่งในกระดานหรือตาราง, เพื่อให้มั่นใจว่าแต่ละเหตุการณ์เกมที่เกิดขึ้น, ไม่เคยเกิดขึ้นมาก่อน

เหตุการณ์เกม
เหตุการณ์เกมคือการแปลจาก float ที่สร้างขึ้นแบบสุ่มไปเป็นผลลัพธ์ที่สามารถเชื่อมโยงได้เฉพาะสำหรับเกมนั้นๆ

ด้านล่างนี้คือลักษณะการแปลจาก float เป็นเหตุการณ์สำหรับแต่ละเกมที่แตกต่างกันในแพลตฟอร์มของเรา

Blackjack, Hilo
ในสำรับไพ่มาตรฐาน, มีผลลัพธ์ที่เป็นไปได้ที่ไม่ซ้ำกัน 52 ผลลัพธ์

// ดัชนีจาก 0 ถึง 51 : ♦2 ถึง ♣A

const CARDS = [

♦2, ♥2, ♠2, ♣2, ♦3, ♥3, ♠3, ♣3, ♦4, ♥4,
♠4, ♣4, ♦5, ♥5, ♠5, ♣5, ♦6, ♥6, ♠6, ♣6,
♦7, ♥7, ♠7, ♣7, ♦8, ♥8, ♠8, ♣8, ♦9, ♥9,
♠9, ♣9, ♦10, ♥10, ♠10, ♣10, ♦J, ♥J, ♠J,
♣J, ♦Q, ♥Q, ♠Q, ♣Q, ♦K, ♥K, ♠K, ♣K, ♦A,
♥A, ♠A, ♣A
];

// แปลเหตุการณ์เกม

const card = CARDS[Math.floor(float * 52)];

ปัจจัยเดียวที่แตกต่างที่เกี่ยวข้องกับเกมเหล่านี้คือกับ Halo และ แบล็คแจ็ค มี cursor 13 เพื่อสร้าง 52 ผลลัพธ์ที่เป็นไปได้สำหรับกรณีที่ต้องแจกไพ่จำนวนมากให้กับผู้เล่น, ในขณะที่ใน Baccarat เราต้องการเพียงแค่ 6 เหตุการณ์เกมที่สร้างขึ้นเพื่อครอบคลุมจำนวนไพ่ที่สามารถเล่นได้มากที่สุด

Poker Diamonds
เมื่อเล่น Diamond Poker, มีผลลัพธ์ที่เป็นไปได้ 7 ผลลัพธ์ในรูปแบบของเพชร

// ดัชนี 0 ถึง 6 : จากเขียวไปสีน้ำเงิน

const DIAMONDS = [ เขียว, ม่วง, เหลือง, แดง, ฟ้า, ส้ม, น้ำเงิน ];

// แปลเหตุการณ์เกม

const diamond = DIAMONDS[Math.floor(float * 7)];

ทั้งดีลเลอร์และผู้เล่นจะได้รับเพชร 5 เม็ด, ซึ่งหมายความว่าเกม Diamond Poker ที่สมบูรณ์ต้องการการสร้างเหตุการณ์เกม 10 เหตุการณ์